@layerzerolabs/ton-sdk-tools 3.0.87 → 3.0.89
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 +12 -0
- package/dist/index.cjs +169 -211
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.mjs +159 -213
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/sdk-tools.ts","../src/address-utils.ts","../src/base-wrapper.ts","../src/ClasslibWrapper.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","../src/send-tx.ts","../src/all-storages.ts","../src/common-ton/src/wallet.ts","../src/common-ton/src/cells.ts","../src/common-ton/src/class/generators.ts","../src/common-ton/src/class/helpers.ts","../src/common-ton/src/class/class.ts","../src/common-ton/src/deepDecodeCell.ts","../src/common-ton/src/deepDiffCells.ts"],"names":["beginCell","Dictionary","storeMessageRelaxed","Cell","loadMessageRelaxed","crc32","fs","path","str","name","toBigIntBE","toBufferBE","Address","SendMode","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3","mnemonicToHDSeed","deriveEd25519Path","keyPairFromSeed","WalletContractV4","mnemonicToWalletKey","BitString","BitBuilder","field","asciiStringToBigint","cell","className","BitReader","Slice"],"mappings":"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AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,oCAAA,EA+wCK,QAAQ,eAAe,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,CAAA;AA4DzD,EAAAM,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,SAAmB,EAAA,QAAA,EAAkB,YAA6C,EAAA;AACnH,EAAM,MAAA,OAAA,GAAU,iBAAiB,YAAY,CAAA;AAE7C,EAAA,MAAM,SAAY,GAAA,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6DAAA,EAmByC,QAAQ,eAAe,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,CAAA;AAoVlF,EAAAD,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,SAAmB,EAAA,QAAA,EAAkB,YAA6C,EAAA;AACnH,EAAM,MAAA,OAAA,GAAU,iBAAiB,YAAY,CAAA;AAE7C,EAAA,MAAM,SAAY,GAAA,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,QAAA,EA6CZ,QAAQ,eAAe,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;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAA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","file":"index.cjs","sourcesContent":["import { Cell, Dictionary, MessageRelaxed, beginCell, loadMessageRelaxed, storeMessageRelaxed } from '@ton/core'\nimport * as crc32 from 'crc-32'\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\nexport const PUBLIC_KEY_BYTE_LENGTH = 64\n\nexport function publicKeyToHash(publicKey: Uint8Array): bigint {\n const publicKeyCell = beginCell().storeBuffer(Buffer.from(publicKey), PUBLIC_KEY_BYTE_LENGTH).endCell()\n const publicKeyHash = BigInt('0x' + publicKeyCell.hash().toString('hex'))\n return publicKeyHash\n}\n\nexport function createVerifierDictSet(verifiers: Uint8Array[]): Cell {\n const verifierDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n for (const verifier of verifiers) {\n verifierDict.set(publicKeyToHash(verifier), beginCell().endCell())\n }\n return beginCell().storeDictDirect(verifierDict, Dictionary.Keys.BigUint(256), Dictionary.Values.Cell()).endCell()\n}\n\nexport const getBocStringFromMessage = (message: MessageRelaxed): string => {\n return beginCell().store(storeMessageRelaxed(message)).endCell().toBoc().toString('base64')\n}\n\nexport const getMessageFromBocString = (bocString: string): MessageRelaxed => {\n const cell = Cell.fromBase64(bocString)\n const cellSlice = cell.beginParse()\n return loadMessageRelaxed(cellSlice)\n}\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 interface BlueprintArtfiact {\n hex: string\n hash?: string\n hashBase64?: string\n}\n\nexport const cellFromArtifact = ({ hex }: BlueprintArtfiact): Cell => 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 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 case 'addressList':\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 case 'addressList':\n case 'address_list':\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+::([A-Za-z0-9]+)\\s*=\\s*(\\d+);/gm\n let match\n\n let nextIndex = 0\n while ((match = regex.exec(strInput)) !== null) {\n const [, fieldName, fieldIndexStr] = match\n const fieldIndex = parseInt(fieldIndexStr, 10)\n if (fieldIndex !== nextIndex) {\n continue\n }\n fieldMap[fieldIndex] = fieldName\n inverseFieldMap[fieldName] = fieldIndex\n nextIndex++\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 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 saveBaseEventHandler(\n directory: string,\n opcodesImportPath = '../constants',\n allTypesImportPath = './allTypes',\n tonObjectUnwrapperImportPath = './TonObjectUnwrapper',\n tonContractWrapperImportPath = './TonContractWrapper',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const allTypes = ['ActionEvent', 'Md', 'nameMap'].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'\nimport { ExtendedContract } from '${baseWrapperImportPath}'\n\nimport { OPCODES } from '${opcodesImportPath}'\n\nimport { getLzDict,\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\n\nimport { TonObjectUnwrapper } from '${tonObjectUnwrapperImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\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 = TonContractWrapper.bigintToAsciiString(this._event.topic)\n this.bodyName = await wrapper.getTypeOf(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 BaseEventHandler {\n public allFailures = {\n txList: [] as BlockchainTransaction[],\n events: [] as EventMessageSent[],\n }\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n }\n\n async postProcessSuccess(event: LzEvent, tx: BlockchainTransaction & Transaction): Promise<void> {\n // base case: do nothing\n }\n\n async postProcessFailure(event: EventMessageSent, tx: BlockchainTransaction & Transaction): Promise<void> {\n // base case: do nothing\n }\n\n async addCurrentEventsToAllEvents(\n results: SendMessageResult,\n contract: ExtendedContract<TonContractWrapper>\n ): 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 await this.postProcessSuccess(newLzEvent, tx)\n }\n } else {\n const failureEvent = results.events[i] as EventMessageSent\n this.allFailures.txList.push(tx)\n this.allFailures.events.push(failureEvent)\n await this.postProcessFailure(failureEvent, tx)\n }\n }\n }\n}\n`\n fs.writeFileSync(path.join(directory, 'BaseEventHandler.ts'), savedCode)\n}\n\nexport function saveLzEventHandler(\n directory: string,\n allTypesImportPath = './allTypes',\n baseEventHandlerImportPath = './BaseEventHandler'\n): void {\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 } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\n\nimport { Md, MdPacketSent } from '${allTypesImportPath}'\nimport { BaseEventHandler, LzEvent } from '${baseEventHandlerImportPath}'\n\nexport class LzEventHandler extends BaseEventHandler {\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n packetsSent: [] as MdPacketSent[],\n }\n\n async postProcessSuccess(event: LzEvent, tx: BlockchainTransaction & Transaction): Promise<void> {\n if (event.topic === 'Channel::event::PACKET_SENT' && this.isMdPacketSent(event.body)) {\n this.allVictories.packetsSent.push(event.body)\n }\n await Promise.resolve()\n }\n\n isMdPacketSent(md: Md): md is MdPacketSent {\n return (\n 'nativeFee' in md &&\n 'zroFee' in md &&\n 'extraOptions' in md &&\n 'enforcedOptions' in md &&\n 'packetEncoded' in md &&\n 'nonce' in md\n )\n }\n}\n`\n fs.writeFileSync(path.join(directory, 'LzEventHandler.ts'), savedCode)\n}\n\nexport function saveTonContractWrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n classlibWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const generatedMethods = Object.entries(tonObjects)\n .map(([_, tonObject]) => tonObject.constructorCode ?? '')\n .join('\\n')\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 beginCell,\n} from '@ton/core'\n\nimport { ClasslibWrapper } from '${classlibWrapperImportPath}'\n\nexport class TonContractWrapper extends ClasslibWrapper {\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 ${generatedMethods}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonContractWrapper.ts'), savedCode)\n}\n\nexport function saveAllTypes(\n tonObjects: TonObjectsDict,\n directory: string,\n tonContractWrapperImportPath = './TonContractWrapper',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): 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 const keyMapping: { [key: string]: string } = {}\n Object.entries(tonObjects).forEach(([key, 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 keyMapping[item.tonName] = key\n })\n const generatedNameMaps = `\n export const nameMap: { [key: string]: string } = {\n ${Object.entries(mapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val[0] + \"',\")\n .join('\\n')}\n }\n \n export const keyMap: { [key: string]: string } = {\n ${Object.entries(keyMapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val + \"',\")\n .join('\\n')}\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 '${tonContractWrapperImportPath}'\nimport { ExtendedContract } from '${baseWrapperImportPath}'\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 async 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 interface Md {}\n\n${generatedTypes}\n\n${generatedNameMaps}\n`\n\n fs.writeFileSync(path.join(directory, 'allTypes.ts'), savedCode)\n}\n\nexport function saveLzGasTracker(directory: string, opcodesImportPath = '../constants'): void {\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 '${opcodesImportPath}'\n\nexport interface 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 fs.writeFileSync(path.join(directory, 'LzGasTracker.ts'), savedCode)\n}\n\nexport function saveTonObjectUnwrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n allTypesImportPath = './allTypes',\n tonContractWrapperImportPath = './TonContractWrapper',\n classlibWrapperImportPath = '@layerzerolabs/ton-sdk-tools',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\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 { getLzDict,\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\nimport { ClasslibWrapper } from '${classlibWrapperImportPath}'\nimport { ExtendedContract } from '${baseWrapperImportPath}'\n\nexport class TonObjectUnwrapper {\n${Array.from(\n new Map(\n Object.entries(tonObjects)\n .filter(([_, constructor]) => constructor.deconstructorCode)\n .map(([_, constructor]) => [constructor.tonName, constructor.deconstructorCode])\n ).values()\n).join('\\n')}\n}\n\n/* eslint-disable @typescript-eslint/unbound-method */\nexport const deconstructorMap = {\n ${Array.from(\n new Map(\n Object.entries(tonObjects)\n .filter(\n ([_, constructor]) =>\n constructor.deconstructorName != null &&\n constructor.deconstructorName !== '' &&\n constructor.deconstructorCode != null &&\n constructor.deconstructorCode !== ''\n )\n .map(([_, constructor]) => [constructor.tonName, constructor.deconstructorName])\n )\n )\n .map(([tonName, deconstructorName]) => `${tonName}: TonObjectUnwrapper.${deconstructorName},`)\n .join('\\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 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 extractOpcodes(fileNames: string[]): Map<string, bigint> {\n const firstFormat = /const int\\s+([\\w:]+::(?:OP|op)::\\w+)\\s*=\\s*\"([\\w:]+::(?:OP|op)::\\w+)\"c;/\n const secondFormat = /const\\s+(?:int\\s+)?([\\w:]+::[a-zA-Z]+::(?:op|OP)::\\w+)\\s*=\\s*(0x[\\da-fA-F]+);/\n const thirdFormat = /const\\s+(int\\s+)?(op::(\\w+))\\s*=\\s*(0x[0-9a-fA-F]+);/\n const fourthFormat = /^\\s*int\\s+(op::(\\w+))\\(\\)\\s+asm\\s+\"((?:0x)?[0-9a-fA-F]+)\\s+([A-Z]+)\"\\s*;$/\n const fifthFormat = /^\\s*const\\s+int\\s+(OP::[A-Z][a-zA-Z]+)\\s*=\\s*\"(OP::[A-Z][a-zA-Z]+)\"c\\s*;$/\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 ;[, 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 (rawVariableName !== '' && rawValue !== '') {\n result.set(tonConstNameToTSName(rawVariableName), value)\n }\n }\n }\n return result\n}\n\nexport function extractErrors(fileNames: string[]): Map<string, bigint> {\n const 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 const secondFormat = /^const\\s+(?:int\\s+)?(error::\\w+)\\s*=\\s*((?:0x[\\da-fA-F]+|\\d+));$/\n const thirdFormat = /^const\\s+int\\s+([\\w:]+::(?:ERROR|error)::\\w+)\\s*=\\s*(\\d+);$/i\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 if (firstFormatMatch) {\n ;[, rawVariableName, rawValue] = firstFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue) & ERRORCODE_MASK\n } else if (secondFormatMatch) {\n ;[, rawVariableName, rawValue] = secondFormatMatch as [string, string, string]\n value = BigInt(rawValue) & ERRORCODE_MASK\n } else if (thirdFormatMatch) {\n ;[, rawVariableName, rawValue] = thirdFormatMatch as [string, string, string]\n value = BigInt(rawValue) & ERRORCODE_MASK\n }\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 // Original regex for complex event patterns\n const firstFormat = /^const\\s+(?:int\\s+)?([\\w:]+::[eE][vV][eE][nN][tT]::[\\w:]+)\\s*=\\s*\"([\\w:]+)\"[uc];$/\n // New regex for EVENT/event pattern - case insensitive and allows any string content\n const secondFormat = /^const\\s+int\\s+([eE][vV][eE][nN][tT]::\\w+)\\s*=\\s*\"([^\"]+)\"u;$/\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\n // Try both regex patterns\n const eventFormatMatch = trimmedLine.match(firstFormat) ?? trimmedLine.match(secondFormat)\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 for (const dir of contractDirs) {\n const files = fs.readdirSync(dir).filter((file) => file.endsWith('.fc') || file.endsWith('.func'))\n\n for (const file of files) {\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*\\{/gm\n let match\n\n while ((match = functionRegex.exec(content)) !== null) {\n const [, returnType, name, argsString] = 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 functionArgs = [\n 'contract: ExtendedContract<TonContractWrapper>',\n ...Object.entries(tsArgs).map(function ([argName, argType]) {\n return `${argName}: ${argType}`\n }),\n ]\n\n const fnName = snakeToCamelCase('get_' + name)\n\n const code = [\n `static async ${fnName}(`,\n indent(functionArgs.join(',\\n')),\n `): Promise<[${tsReturnTypes.join(', ')}]> {`,\n ]\n\n const hasArgs = Object.keys(tonArgs).length > 0\n if (hasArgs) {\n code.push(indent(`const args: TupleItem[] = [`))\n\n const innerArgs = Object.entries(tonArgs).map(function ([argName, argType]) {\n return `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(argName, argType)} }`\n })\n\n code.push(indent(innerArgs.join(',\\n'), 2))\n\n code.push(indent(`]`))\n }\n\n code.push(indent(`const stack = await contract.getViewFunction('${name}', ${hasArgs ? 'args' : '[]'})`))\n\n const returnCalls = tonReturnTypes.map(function (_, index) {\n return `stack.${tonTypeToReadTupleFunction(tonReturnTypes[index])}`\n })\n\n code.push(indent(`return [ ${returnCalls.join(', ')} ]`))\n\n code.push('}')\n\n viewFunctions[contractName].push({\n name: fnName,\n args: tonArgs,\n returnType: tonReturnTypes,\n code: code.join('\\n'),\n })\n }\n }\n }\n return viewFunctions\n}\n\nfunction indent(input: string, count = 1): string {\n return input\n .split('\\n')\n .map(function (line) {\n return `${'\\t'.repeat(count)}${line}`\n })\n .join('\\n')\n}\n\nexport function saveViewFunctions(viewFunctions: TonViewFunctionsDict, directory: string, filename: string): void {\n const generated = [\n file_signature_header,\n `import { Address, Cell, Tuple, TupleItem, beginCell } from '@ton/core'`,\n `import { TonContractWrapper } from '../wrappers'`,\n `import { ExtendedContract } from '@layerzerolabs/ton-sdk-tools'`,\n '',\n ]\n\n for (const [contractName, functions] of Object.entries(viewFunctions)) {\n generated.push(`export class ${contractName} {`)\n generated.push(functions.map((fn) => indent(fn.code)).join('\\n\\n'))\n generated.push(`}`)\n generated.push('')\n }\n\n fs.writeFileSync(path.join(directory, filename), generated.join('\\n'))\n}\n","import { Address } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\n\nimport { AddressTypeLike } from './common-ton/src/class/class'\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\nexport function 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 bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const parseTonAddress = (address: AddressTypeLike): Address => {\n if (address instanceof Address) {\n return address\n }\n\n if (typeof address === 'bigint' || typeof address === 'number') {\n return bigintToAddress(BigInt(address))\n }\n\n if (address.startsWith('0x')) {\n // If it's a hex address format it to ton format\n return bigintToAddress(BigInt(address))\n }\n\n try {\n return Address.parse(address)\n } catch (e) {\n // handles the case where the address is hex format without leading 0x\n return bigintToAddress(BigInt(`0x${address}`))\n }\n}\n\nconst _addressToNotPaddedHex = (address: AddressTypeLike): string => {\n return `0x${parseTonAddress(address).hash.toString('hex')}`\n}\n\nexport const bigIntToHex = (bigInt: bigint): string => {\n return `0x${bigInt.toString(16)}`.toLowerCase()\n}\n\nexport const addressToHex = (address: AddressTypeLike): string => {\n return `0x${to32ByteBuffer(_addressToNotPaddedHex(address)).toString('hex')}`.toLowerCase()\n}\n\nexport const addressToBigInt = (address: AddressTypeLike): bigint => {\n return BigInt(_addressToNotPaddedHex(address))\n}\n\nexport const compareAddresses = (addressA: AddressTypeLike, addressB: AddressTypeLike): boolean => {\n return parseTonAddress(addressA).equals(parseTonAddress(addressB))\n}\n","import {\n Address,\n Builder,\n Cell,\n Contract,\n ContractProvider,\n OpenedContract,\n SendMode,\n Sender,\n SenderArguments,\n beginCell,\n} from '@ton/core'\nimport { SandboxContract } from '@ton/sandbox'\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\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n","////// Generated by sdk/sdk-generator.ts\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n beginCell,\n contractAddress,\n} from '@ton/core'\n\nimport { BaseWrapper, SendRequestOptions } from './base-wrapper'\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 ClasslibWrapper extends BaseWrapper {\n static create(code: Cell, data: Cell, workchain = 0): ClasslibWrapper {\n const init = { code, data }\n return new ClasslibWrapper(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 sendTonPayment(provider: ContractProvider, via: Sender, opts: SendRequestOptions): Promise<void> {\n if (via.address === undefined) {\n throw new Error('Sender address is not defined')\n }\n const request = this.buildSenderArguments(beginCell().endCell(), opts)\n return this.sendRequest(provider, via, request)\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 getContractBalanceView(provider: ContractProvider, futureSeconds: bigint): Promise<bigint> {\n const getResult = await provider.get('getContractBalanceView', [{ type: 'int', value: futureSeconds }])\n return getResult.stack.readBigNumber()\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 getTypeOf(provider: ContractProvider, cell: Cell): Promise<string> {\n const ret = await provider.get('cl::typeof', [{ type: 'cell', cell: cell }])\n return ClasslibWrapper.bigintToAsciiString(ret.stack.readBigNumber())\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 static 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}\n","import fs from 'fs'\nimport path from 'path'\n\ninterface SharedGeneratorOptions {\n relativeSrcPath?: string\n}\n\nfunction getSharedOptions(input?: SharedGeneratorOptions): Required<SharedGeneratorOptions> {\n const ret: Required<SharedGeneratorOptions> = {\n relativeSrcPath: '../../src',\n ...input,\n }\n\n if (ret.relativeSrcPath.endsWith('/')) {\n throw new Error('relativeSrcPath should not end with a /')\n }\n\n return ret\n}\n\nexport function generateCommonTestUtils(\n directory: string,\n filename: string,\n optionsInput?: SharedGeneratorOptions\n): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import fs from 'fs'\n\nimport {\n Address,\n Builder,\n Cell,\n Dictionary,\n SendMode,\n TupleItem,\n TupleItemCell,\n TupleItemInt,\n beginCell,\n toNano,\n} 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'\nimport { ethers } from 'ethers'\n\nimport AllStoragesArtifact from '@layerzerolabs/layerzero-v2-ton/build/AllStorages.compiled.json'\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 ZroMinterArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroMinter.compiled.json'\nimport ZroWalletArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroWallet.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 {\n JettonMinter,\n JettonWallet,\n MultiSigOpCodes,\n Multisig,\n Order,\n Profile,\n TransferRequest,\n addressToBigInt,\n buildOnchainMetadata,\n cellFromArtifact,\n getRandomInt,\n printTransactionTrace,\n ExtendedContract,\n sendMessageViaMultisigAndExpect,\n sendInternalMessageAndExpect,\n toHaveTransactions\n} from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n deconstructorMap,\n keyMap,\n} from '${options.relativeSrcPath}'\n\nexport const ActionTypes: { [key: string]: bigint } = {\n increment: BigInt(1),\n aba: BigInt(2),\n}\n\nexport interface PacketInFlight {\n fromEid: bigint\n toEid: bigint\n mdPacketSent: MdPacketSent\n}\n\nexport interface SendOptions {\n dstEid: bigint\n actionType: bigint\n extraOptions: Cell\n nativeFee: bigint\n zroFee: bigint\n}\n\nexport const invertedOpcodes = Object.fromEntries(\n Object.entries(OPCODES).map(([key, value]) => [value.toString(), key])\n)\n\nexport const newTonObjectsContainer: { items: { [key: string]: unknown } } = {\n items: {},\n}\n\nexport const PUBLIC_KEY_BYTE_LENGTH = 64\nexport const SIGNATURE_BYTE_LENGTH = 65\nconst SEED_SIZE = 32\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// ===============================INTERFACES===============================\n\nexport function publicKeyToHash(publicKey: string): bigint {\n // Remove '0x' prefix and convert to Buffer\n const publicKeyBuffer = Buffer.from(publicKey.slice(2), 'hex')\n // skip the first byte (h) as it's always 4\n const publicKeyWithoutH = publicKeyBuffer.subarray(1)\n const publicKeyCell = beginCell().storeBuffer(publicKeyWithoutH, PUBLIC_KEY_BYTE_LENGTH).endCell()\n const publicKeyHash = BigInt('0x' + publicKeyCell.hash().toString('hex'))\n return publicKeyHash\n}\n\n// ==============================VERIFIER SET==============================\n\nexport function generateRandomVerifierSet(count: number): ethers.Wallet[] {\n const verifiers: ethers.Wallet[] = []\n for (let i = 0; i < count; i++) {\n const privateKey = ethers.utils.randomBytes(SEED_SIZE)\n verifiers.push(new ethers.Wallet(privateKey))\n }\n return verifiers\n}\n\nexport async function createVerifierDictSet(\n verifiers: ethers.Wallet[],\n wrapper: ExtendedContract<TonContractWrapper>\n): Promise<Cell> {\n const verifierDict = LzDict.empty()\n for (const verifier of verifiers) {\n await verifierDict.set(publicKeyToHash(verifier.publicKey), beginCell().endCell(), wrapper)\n }\n return verifierDict.asCell()\n}\n\nexport function serializeAddressList(admins: SandboxContract<TreasuryContract | TonContractWrapper>[]): Cell {\n const addressList = admins.map((admin) => addressToBigInt(admin.address))\n\n // Start with array of builders, initialize with first builder\n const addressListBuilder: Builder[] = [beginCell()]\n\n // Iterate through each address\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let idx = 0; idx < addressList.length; idx++) {\n // Check if current builder has enough space for next address (256 bits)\n if (addressListBuilder[addressListBuilder.length - 1].availableBits < 256) {\n // If not enough space, create new builder\n addressListBuilder.push(beginCell())\n }\n\n // Store the address in current builder\n addressListBuilder[addressListBuilder.length - 1].storeUint(addressList[idx], 256)\n }\n\n // Build the cell chain from back to front\n let resultCell: Cell = addressListBuilder.pop()!.endCell()\n while (addressListBuilder.length > 0) {\n const head = addressListBuilder.pop()!\n resultCell = head.storeRef(resultCell).endCell()\n }\n\n return resultCell\n}\n\n// ===============================INTERFACES===============================\n\nexport interface LogData {\n [key: string]: string | bigint\n}\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface LzReceiveExpectArgs {\n lzReceivePrepareMd: Cell\n oAppFixture: OAppFixture\n deployer: SandboxContract<TreasuryContract>\n eventHandler: LzEventHandler\n msglib?: SandboxContract<TonContractWrapper>\n msglibConnection?: SandboxContract<TonContractWrapper>\n expectedLastEvent?: string\n msglibSendOpcode?: bigint\n profile?: Profile\n extraTransactions?: FlatTransactionComparable[]\n gasValue?: bigint\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 msglib: Map<bigint, SandboxContract<TonContractWrapper>>\n msglibManager: 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 msglibConnection: SandboxContract<TonContractWrapper>\n msglibConnectionCustom?: SandboxContract<TonContractWrapper>\n}\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): void {\n const formatAddress = (address: Address | string): string => {\n return address.toString()\n }\n\n const collectAddresses: (\n prefix: string,\n protocolHeader: string,\n oappHeader: string,\n fixture: OAppFixture,\n eid: bigint\n ) => {\n [p: string]: string | bigint | null\n } = function (prefix: string, protocolHeader: string, oappHeader: string, fixture: OAppFixture, eid: bigint) {\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}.msglibManager.address\\`]: formatAddress(fixture.msglibManager.address),\n [\\`\\${prefix}.msglib.address\\`]: formatAddress(fixture.msglib.get(eid)?.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}.msglibConnection.address\\`]: formatAddress(fixture.msglibConnection.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(\n 'srcFixture',\n 'Source Protocol Addresses',\n 'Source OApp Addresses',\n srcFixture,\n dstFixture?.eid ?? 0n\n ),\n ...(dstFixture\n ? collectAddresses(\n 'dstFixture',\n 'Destination Protocol Addresses',\n 'Destination OApp Addresses',\n dstFixture,\n srcFixture.eid\n )\n : {}),\n }\n\n // Format addresses in additionalLogData\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 requireDefined<T>(value: T | undefined): asserts value is T {\n if (value === undefined) {\n throw new Error('Value is undefined')\n }\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('decodeAndOverrideNonce<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function createLzPacketFromPacketEncodedOverrideNonceAndGuid(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('decodeAndOverrideNonceAndGuid<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function overrideNonceAndGuid(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('decodeAndOverrideNonceAndGuidSerialized<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\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): unknown {\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 lzReceiveAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n expectedLastEvent,\n profile,\n extraTransactions = [],\n gasValue = OAppFlowGas['Channel.LZ_RECEIVE_PREPARE'],\n}: LzReceiveExpectArgs): Promise<MdPacketSent> {\n const { oApp, channel, controller } = oAppFixture\n\n const expectedTransactions: FlatTransactionComparable[] = [\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, could come fromm either channel or OApp\n {\n to: deployer.address,\n success: true,\n },\n ]\n expectedTransactions.push(...extraTransactions)\n\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: gasValue,\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: lzReceivePrepareMd,\n expectedTransactions,\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n if (expectedLastEvent !== undefined) {\n // expect last event to be packet delivered\n expect(eventHandler.allVictories.eventObjects[eventHandler.allVictories.eventObjects.length - 1].topic).toBe(\n expectedLastEvent\n )\n }\n\n return eventHandler.allVictories.packetsSent[eventHandler.allVictories.packetsSent.length - 1]\n}\n\nexport async function lzReceiveAbaAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n msglib,\n msglibConnection,\n expectedLastEvent,\n msglibSendOpcode,\n profile,\n gasValue = OAppFlowGas['Channel.LZ_RECEIVE_PREPARE_ABA'],\n}: LzReceiveExpectArgs): Promise<MdPacketSent> {\n const { oApp, channel, controller, endpoint } = oAppFixture\n\n const extraTransactions: FlatTransactionComparable[] = [\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: msglibConnection!.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_SEND),\n success: true,\n },\n {\n from: msglibConnection!.address,\n to: msglib!.address,\n op: Number(msglibSendOpcode),\n success: true,\n },\n {\n from: msglib!.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 return lzReceiveAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n msglib,\n msglibConnection,\n expectedLastEvent,\n msglibSendOpcode,\n profile,\n gasValue,\n extraTransactions,\n })\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 assertCommittableView(\n ulnConnection: SandboxContract<TonContractWrapper>,\n nonce: bigint,\n packet: Cell,\n defaultUlnReceiveConfig: Cell\n): Promise<bigint> {\n return (\n (\n await ulnConnection.getViewFunction('committableView', [\n { type: 'int', value: nonce },\n { type: 'cell', cell: packet },\n { type: 'cell', cell: defaultUlnReceiveConfig },\n ])\n ).pop() as TupleItemInt\n ).value\n}\n\nexport async function assertVerifiedView(\n contract: ExtendedContract<TonContractWrapper>,\n dvnAddress: bigint,\n nonce: bigint,\n packetHash: bigint,\n requiredConfirmations: bigint\n): Promise<bigint> {\n const args: TupleItem[] = [\n { type: 'int', value: dvnAddress },\n { type: 'int', value: nonce },\n { type: 'int', value: packetHash },\n { type: 'int', value: requiredConfirmations },\n ]\n return (await contract.getViewFunction('verifiedView', args)).readBigNumber()\n}\n\nexport async function getExecutionStatus(\n contract: ExtendedContract<TonContractWrapper>,\n incomingNonce: bigint\n): Promise<bigint> {\n const args: TupleItem[] = [{ type: 'int', value: incomingNonce }]\n return (await contract.getViewFunction('_viewExecutionStatus', args)).readBigNumber()\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\n// ===============================DEPLOYING CONTRACTS===============================\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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\n// ============================== ZRO HELPER FUNCTIONS==============================\n\nexport const zroOnchainMetaData = {\n name: 'LayerZero',\n symbol: 'ZRO',\n decimals: '9',\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\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 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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 function isValidAscii(input: string): boolean {\n for (let i = 0; i < input.length; i++) {\n if (input.charCodeAt(i) > 127) {\n return false\n }\n }\n return true\n}\n\nexport async function txDecoder(\n contract: SandboxContract<TonContractWrapper>,\n internalMsgResults: SendMessageResult\n): Promise<void> {\n // Create a Set to store unique messages\n const uniqueMessages = new Set<Cell>()\n\n // Collect all inMessages and outMessages\n for (const tx of internalMsgResults.transactions) {\n if (tx.inMessage?.body) {\n uniqueMessages.add(tx.inMessage.body)\n }\n if (tx.inMessage?.init?.data) {\n uniqueMessages.add(tx.inMessage.init.data)\n }\n for (const outMsg of tx.outMessages.values()) {\n uniqueMessages.add(outMsg.body)\n }\n }\n\n // Decode all unique messages and their first refs\n for (const msg of uniqueMessages) {\n await runtimeDecoder(contract, msg).catch(() => {})\n\n // Try to decode all refs in body\n const { refs } = msg\n for (const ref of refs) {\n await runtimeDecoder(contract, ref).catch(() => {})\n }\n }\n}\n\nexport async function runtimeDecoder(contract: SandboxContract<TonContractWrapper>, obj: Cell): Promise<void> {\n const { tonObjects } = require('${options.relativeSrcPath}/offchain-helpers/allObjects') as { [key: string]: { [key: string]: any } }\n\n const typeName = await contract.getTypeOf(obj)\n\n const tonObjectDefKey = keyMap[typeName] ?? ('' as any)\n // if key not found, return early\n if (tonObjectDefKey === '') {\n return\n }\n\n // find the corresponding decoder function for your ton object\n const decoderFn = deconstructorMap[typeName as keyof typeof deconstructorMap]\n const decoded = await decoderFn(contract, obj)\n\n // Get the corresponding ton object definition\n const tonObjectDef = tonObjects[tonObjectDefKey as keyof typeof tonObjects] as { [key: string]: any }\n // cast a copy of it to any so we can modify the attributes\n const tonObjectDefCopy = tonObjectDef\n\n // Iterate through the properties of the ton object definition\n for (const [key, value] of Object.entries(tonObjectDef)) {\n if (!isNaN(parseInt(key))) {\n // Skip non-numeric keys like 'name'\n const jsonField = value as { fieldName: string; fieldType: string }\n const jsonFieldNameParts = jsonField.fieldName.split('::')\n const fieldName = jsonFieldNameParts[jsonFieldNameParts.length - 1]\n\n // Throw if decoded doesn't have this field\n if (!Object.keys(decoded).includes(fieldName)) {\n throw new Error(\\`Field \\${fieldName} not found in decoded object\\`)\n }\n\n const field = decoded[fieldName as keyof typeof decoded] as Cell | bigint | LzDict\n\n // If field is an objRef, try to decode the corresponding decoded value\n if (jsonField.fieldType === 'cl::t::objRef' && field instanceof Cell) {\n let newCellFieldType = await contract.getTypeOf(field)\n if (newCellFieldType === 'NULL') {\n newCellFieldType = 'cl::t::cellRef'\n } else {\n // Check if newCellFieldType is valid ASCII\n if (!isValidAscii(newCellFieldType)) {\n newCellFieldType = 'cl::t::cellRef'\n } else {\n newCellFieldType = keyMap[newCellFieldType] ?? newCellFieldType\n }\n }\n jsonField.fieldType = newCellFieldType\n tonObjectDefCopy[key] = jsonField\n newTonObjectsContainer.items[tonObjectDefKey] = tonObjectDefCopy\n await runtimeDecoder(contract, field)\n } else {\n continue\n }\n }\n }\n newTonObjectsContainer.items[tonObjectDefKey] = tonObjectDefCopy\n}\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateSmlTestUtils(directory: string, filename: string, optionsInput?: SharedGeneratorOptions): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import { Cell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, SendMessageResult, TreasuryContract } from '@ton/sandbox'\nimport '@ton/test-utils'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.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 { Profile, addressToBigInt, cellFromArtifact, sendInternalMessageAndExpect, } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n addMsgLibToController,\n emptyObject,\n protocolSetupGas,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\nimport { LzEventHandler, OPCODES, TonContractWrapper } from '${options.relativeSrcPath}'\n\nconst SML_MANAGER_DEFAULT_VERSION = BigInt(1)\nconst SML_MANAGER_CUSTOM_VERSION = BigInt(2)\n\n// ==============================SML INTEGRATION FUNCTIONS==============================\n\nexport async function commitVerificationAndExpectSml(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n { endpoint, channel, msglibManager: smlManager, msglibConnection: smlConnection, controller }: 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\n// ===============================HELPER ASSERTS===============================\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 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.msglibManager, srcFixture.msglibConnection] = 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.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n // in SML, the connection is the Msglib\n srcFixture.msglib = new Map()\n srcFixture.msglib.set(srcFixture.eid, srcFixture.msglibConnection)\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\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\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateUlnTestUtils(directory: string, filename: string, optionsInput?: SharedGeneratorOptions): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import { Address, Cell, TupleItemCell, beginCell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, SendMessageResult, TreasuryContract } from '@ton/sandbox'\nimport { FlatTransactionComparable } from '@ton/test-utils'\nimport { ethers } from 'ethers'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport DvnArtifact from '@layerzerolabs/layerzero-v2-ton/build/Dvn.compiled.json'\nimport DvnFeelibArtifact from '@layerzerolabs/layerzero-v2-ton/build/DvnFeeLib.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.compiled.json'\nimport ExecutorArtifact from '@layerzerolabs/layerzero-v2-ton/build/Executor.compiled.json'\nimport ExecutorFeelibArtifact from '@layerzerolabs/layerzero-v2-ton/build/ExecutorFeeLib.compiled.json'\nimport PriceFeedCacheArtifact from '@layerzerolabs/layerzero-v2-ton/build/PriceFeedCache.compiled.json'\nimport PriceFeedFeeLibDefaultArtifact from '@layerzerolabs/layerzero-v2-ton/build/PriceFeedFeeLibDefault.compiled.json'\nimport MaliciousFeeLibArtifact from '@layerzerolabs/layerzero-v2-ton/build/MaliciousFeeLib.compiled.json'\nimport ProxyArtifact from '@layerzerolabs/layerzero-v2-ton/build/Proxy.compiled.json'\nimport UlnArtifact from '@layerzerolabs/layerzero-v2-ton/build/Uln.compiled.json'\nimport UlnConnectionArtifact from '@layerzerolabs/layerzero-v2-ton/build/UlnConnection.compiled.json'\nimport UlnManagerArtifact from '@layerzerolabs/layerzero-v2-ton/build/UlnManager.compiled.json'\nimport { BlueprintArtfiact, ExtendedContract, Profile, addressToBigInt, cellFromArtifact, sendInternalMessageAndExpect, sendMessageViaMultisigAndExpect, } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n ProtocolFixture,\n SIGNATURE_BYTE_LENGTH,\n addMsgLibToController,\n createLzPacketFromPacketEncoded,\n createVerifierDictSet,\n emptyObject,\n generateRandomVerifierSet,\n protocolSetupGas,\n publicKeyToHash,\n requireDefined,\n serializeAddressList,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\n\nimport {\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n} from '${options.relativeSrcPath}'\n\nconst ULN_MANAGER_DEFAULT_VERSION = BigInt(1)\n\nexport const TRUE = BigInt(-1)\nexport const FALSE = BigInt(0)\nexport const UlnConnectionVerificationStatusVerifying = BigInt(0)\nexport const UlnConnectionVerificationStatusCommittable = BigInt(1)\nexport const ChannelExecutionStatusExecutable = BigInt(2)\n\nexport interface SendUlnConfig {\n workerQuoteGasLimit: bigint\n maxMessageBytes: bigint\n}\n\nexport interface ReceiveUlnConfig {\n minCommitPacketGas: bigint\n}\n\nexport interface UlnConfig {\n send: SendUlnConfig\n receive: ReceiveUlnConfig\n}\n\nexport interface SendDvnConfig {\n numReqDvns: bigint\n numOptDvns: bigint\n}\n\nexport interface ReceiveDvnConfig {\n numReqDvns: bigint\n numOptDvns: bigint\n optDvnQuorum: bigint\n}\n\nexport interface DvnConfigs {\n send: SendDvnConfig\n receive: ReceiveDvnConfig\n}\n\nexport interface DvnConfig {\n src: DvnConfigs\n dst: DvnConfigs\n}\n\nexport interface CustomConfigs {\n ulnConfig?: UlnConfig\n dvnConfig?: DvnConfig\n}\n\nexport interface WorkerFixture {\n admins: SandboxContract<TreasuryContract>[]\n proxy: SandboxContract<TonContractWrapper>\n}\n\nexport interface DvnFixture extends WorkerFixture {\n dvn: SandboxContract<TonContractWrapper>\n verifiers: ethers.Wallet[]\n}\n\nexport interface ExecutorFixture extends WorkerFixture {\n executor: SandboxContract<TonContractWrapper>\n}\n\nexport interface PricedfeedCacheFixture extends WorkerFixture {\n priceFeedCache: SandboxContract<TonContractWrapper>\n}\n\nexport interface ProtocolFixtureULN extends ProtocolFixture {\n sendDvnFixtures: DvnFixture[]\n sendDvnFixturesCustom: DvnFixture[]\n receiveDvnFixtures: DvnFixture[]\n receiveDvnFixturesCustom: DvnFixture[]\n executorFixtures: ExecutorFixture\n priceFeedCacheFixtures: Map<bigint, PricedfeedCacheFixture>\n defaultUlnSendConfig: Cell\n defaultUlnReceiveConfig: Cell\n}\n\n// ===============================INTERFACES===============================\nexport interface OAppFixtureULN extends ProtocolFixtureULN, OAppFixture {}\n\nexport function serializeDvns(dvnList: bigint[]): Cell {\n const numPayees = dvnList.length\n\n if (numPayees === 0) {\n return beginCell().endCell()\n }\n\n let linkedList = beginCell()\n let idx = 1\n\n while (idx <= numPayees) {\n const address = dvnList[numPayees - idx]\n\n if (idx % 3 === 0) {\n linkedList = beginCell().storeRef(linkedList.endCell()).storeUint(address, 256) // store address as 256-bit integer\n } else {\n linkedList = linkedList.storeUint(address, 256)\n }\n\n idx += 1\n }\n\n return linkedList.endCell()\n}\n\n// ==============================ULN INTEGRATION FUNCTIONS==============================\n\nexport async function commitVerificationAndExpect(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n {\n endpoint,\n channel,\n msglib: uln,\n msglibManager: ulnManager,\n msglibConnection: ulnConnection,\n controller,\n }: OAppFixture,\n dstEid: bigint,\n profile?: Profile\n): Promise<void> {\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: deployer.getSender(),\n contract: msglib,\n opCode: OPCODES.Uln_OP_ULN_COMMIT_PACKET,\n md: await ulnManager.getNewMdMdAddress({\n md: lzPacketCell,\n address: addressToBigInt(ulnConnection.address),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: msglib.address,\n op: Number(OPCODES.Uln_OP_ULN_COMMIT_PACKET),\n success: true,\n },\n {\n from: msglib.address,\n to: ulnConnection.address,\n op: Number(OPCODES.UlnConnection_OP_ULN_CONNECTION_COMMIT_PACKET),\n success: true,\n },\n {\n from: ulnConnection.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: ulnConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: ulnConnection.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, ulnManager)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\n// ===============================DEPLOYING CONTRACTS===============================\n\nexport async function addUlnWorker(\n sender: SandboxContract<TreasuryContract>,\n worker: SandboxContract<TonContractWrapper>,\n workerCallMd: Cell,\n expectedTransactions: FlatTransactionComparable[]\n): Promise<SendMessageResult> {\n return sendInternalMessageAndExpect({\n value: toNano('300'),\n sender: sender.getSender(),\n contract: worker,\n opCode: OPCODES.Worker_OP_CALL_VIA_PROXY,\n md: workerCallMd,\n expectedTransactions,\n balanceRefill: toNano('0'),\n })\n}\n\nexport async function addDvnWorkers(\n allStorages: SandboxContract<TonContractWrapper>,\n { msglibManager, msglib: uln }: OAppFixtureULN,\n sendDvnFixtures: DvnFixture[],\n receiveDvnFixtures: DvnFixture[],\n dstEid: bigint,\n priceFeedCacheAddress: Address,\n eventHandler: LzEventHandler,\n addMaliciousWorker = false\n): Promise<void> {\n requireDefined(sendDvnFixtures)\n requireDefined(receiveDvnFixtures)\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\n let feelibArtifact: BlueprintArtfiact\n if (addMaliciousWorker) {\n feelibArtifact = MaliciousFeeLibArtifact\n } else {\n feelibArtifact = DvnFeelibArtifact\n }\n for (const dvnFixture of [...sendDvnFixtures, ...receiveDvnFixtures]) {\n const dvnWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(msglibManager.address),\n forwardingAddress: 0n,\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(dvnFixture.dvn.address),\n workerFeelibBytecode: cellFromArtifact(feelibArtifact),\n workerFeelibStorage: await allStorages.getNewDvnFeelib({\n quorum: BigInt(0),\n remoteGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(priceFeedCacheAddress),\n dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n })\n\n const internalMsgResults = await addUlnWorker(dvnFixture.admins[0], dvnFixture.dvn, dvnWorkerCallMd, [\n {\n from: dvnFixture.admins[0].address,\n to: dvnFixture.dvn.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: dvnFixture.dvn.address,\n to: dvnFixture.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: dvnFixture.proxy.address,\n to: msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ])\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, msglibManager)\n }\n}\n\nexport function getDvnArrayFromDvnFixtures(\n dvnFixtures: DvnFixture[],\n dvnConfig: SendDvnConfig | ReceiveDvnConfig\n): [bigint[], bigint[], bigint] {\n const dvnArray: bigint[] = []\n const optArray: bigint[] = []\n for (let i = 0; i < dvnConfig.numReqDvns + dvnConfig.numOptDvns; i++) {\n if (i < dvnConfig.numReqDvns) {\n dvnArray.push(addressToBigInt(dvnFixtures[i].proxy.address))\n } else {\n optArray.push(addressToBigInt(dvnFixtures[i].proxy.address))\n }\n }\n return [dvnArray, optArray, 'optDvnQuorum' in dvnConfig ? dvnConfig.optDvnQuorum : BigInt(0)]\n}\n\nexport async function openAndDeployUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n deployMd: Cell,\n srcFixture: OAppFixture,\n dstEid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const uln: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnArtifact),\n await allStorages.getNewUln({\n owner: addressToBigInt(srcFixture.msglibManager.address),\n eid: srcFixture.eid,\n dstEid,\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.UlnManager_OP_DEPLOY_ULN,\n deployMd,\n { value: toNano('10') },\n toNano('0')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_DEPLOY_ULN),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: uln.address,\n success: true,\n deploy: true,\n },\n {\n from: uln.address,\n to: srcFixture.multisig.address,\n success: true,\n },\n ],\n })\n\n requireDefined(uln)\n // Initialize Map if it doesn't exist , otherwise preserve existing entries\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (srcFixture.msglib == undefined) {\n srcFixture.msglib = new Map()\n }\n srcFixture.msglib.set(dstEid, uln)\n return [uln, internalMsgResults]\n}\n\nexport async function openAndDeployUlnManagerViaMultisig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n fixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const ulnManager: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnManagerArtifact),\n await allStorages.getNewUlnManager({\n owner: addressToBigInt(fixture.multisig.address),\n ulnCode: cellFromArtifact(UlnArtifact),\n connectionCode: cellFromArtifact(UlnConnectionArtifact),\n controllerAddress: addressToBigInt(fixture.controller.address),\n eid: fixture.eid,\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: fixture.multisig,\n messageBody: fixture.controller.buildRequest(\n OPCODES.BaseInterface_OP_INITIALIZE,\n await allStorages.getNewMdInitUlnManager({\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: ulnManager,\n deploy: true,\n expectedTransactions: [\n {\n from: fixture.multisig.address,\n to: ulnManager.address,\n success: true,\n },\n ],\n })\n\n return [ulnManager, internalMsgResults]\n}\n\nexport async function openAndDeployUlnConnection(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const msglib = srcFixture.msglib.get(dstFixture.eid)\n requireDefined(msglib)\n const ulnConnection: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnConnectionArtifact),\n await allStorages.getNewUlnConnection({\n owner: addressToBigInt(srcFixture.msglibManager.address),\n path: srcFixture.path,\n ulnAddress: addressToBigInt(msglib.address),\n })\n )\n )\n\n const initUlnConnectionMd = await allStorages.getNewMdInitUlnConnection({\n ulnSendConfigOApp: await allStorages.getNewUlnSendConfigNewWithDefaults(),\n ulnReceiveConfigOApp: await allStorages.getNewUlnReceiveConfigNewWithDefaults(),\n endpointAddress: BigInt(0),\n channelAddress: BigInt(0),\n })\n\n let deployMd = await allStorages.getNewMdDeploy({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n })\n\n deployMd = (\n (\n await allStorages.getViewFunction('cl::set', [\n { type: 'cell', cell: deployMd },\n { type: 'int', value: 3n },\n { type: 'cell', cell: initUlnConnectionMd },\n ])\n ).pop() as TupleItemCell\n ).cell\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: deployMd,\n address: addressToBigInt(srcFixture.msglibManager.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: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_DEPLOY_CONNECTION),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: ulnConnection.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [ulnConnection, internalMsgResults]\n}\n\nexport async function openAndDeployProxyWorker(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n worker: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // 1) deploy the worker\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: worker,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: worker.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 2) construct proxy storage // admins is worker\n const proxy = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ProxyArtifact),\n await allStorages.getNewProxy({\n admins: serializeAddressList([srcFixture.owner, worker]),\n version: 0n,\n })\n )\n )\n\n // 3) deploy proxy\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: proxy,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: proxy.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 4) call worker::setProxy\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: worker,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: worker.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_PROXY,\n md: await allStorages.getNewMdSetAddress({\n address: addressToBigInt(proxy.address),\n }),\n balanceRefill: toNano('0'),\n })\n\n return [worker, proxy, internalMsgResults]\n}\n\nexport async function openAndDeployDvnAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n adminSet: SandboxContract<TreasuryContract>[],\n verifierSet: ethers.Wallet[],\n version: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const dvn = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(DvnArtifact),\n await allStorages.getNewDvn({\n admins: serializeAddressList(adminSet),\n version: version,\n quorum: 1n,\n verifiers: await createVerifierDictSet(verifierSet, allStorages),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, dvn, srcFixture)\n}\n\nexport async function openAndDeployExecutorAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n adminSet: SandboxContract<TreasuryContract>[]\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const executor = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ExecutorArtifact),\n await allStorages.getNewExecutor({\n admins: serializeAddressList(adminSet),\n version: 0n,\n nativeDropTotalCap: BigInt(1),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, executor, srcFixture)\n}\n\nexport async function openAndDeployPriceFeedCacheAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstEid: bigint,\n adminSet: SandboxContract<TreasuryContract>[]\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // todo: fix this with real values\n const priceFeedCache = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(PriceFeedCacheArtifact),\n await allStorages.getNewPriceFeedCache({\n // owner: addressToBigInt(srcFixture.multisig.address),\n admins: serializeAddressList(adminSet),\n version: 0n,\n dstEid,\n priceFeedFeeLib: await allStorages.getNewPriceFeedFeelib({\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, priceFeedCache, srcFixture)\n}\n\nexport async function registerUlnWorkerInfo(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n ulnWorkerFeelibBytecodeCell: Cell\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.UlnManager_OP_REGISTER_WORKER_FEELIB_BYTECODE,\n ulnWorkerFeelibBytecodeCell,\n { value: toNano('1') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_REGISTER_WORKER_FEELIB_BYTECODE),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.multisig.address,\n },\n ],\n })\n}\n\nexport async function deployConfigAndRegisterDvn(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n fixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n dvnConfigs: DvnConfigs\n): Promise<[DvnFixture[], DvnFixture[]]> {\n const dvnAdmins = [fixture.owner]\n const verifierSet = generateRandomVerifierSet(3)\n\n const sendDvnFixtures: DvnFixture[] = []\n const receiveDvnFixtures: DvnFixture[] = []\n\n for (let i = 0; i < dvnConfigs.send.numReqDvns + dvnConfigs.send.numOptDvns; i++) {\n const [dvn, dvnProxy, dvnMsgResults] = await openAndDeployDvnAndProxy(\n blockchain,\n allStorages,\n fixture,\n dvnAdmins,\n verifierSet,\n BigInt(i)\n )\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n sendDvnFixtures.push({\n dvn,\n proxy: dvnProxy,\n admins: dvnAdmins,\n verifiers: verifierSet,\n })\n await eventHandler.addCurrentEventsToAllEvents(dvnMsgResults, dvn)\n }\n\n const randomNumber = Math.floor(Math.random() * 10) + 100\n for (let i = 0; i < dvnConfigs.receive.numReqDvns + dvnConfigs.receive.numOptDvns; i++) {\n const [dvn, dvnProxy, dvnMsgResults] = await openAndDeployDvnAndProxy(\n blockchain,\n allStorages,\n fixture,\n dvnAdmins,\n verifierSet,\n BigInt(randomNumber + i)\n )\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n receiveDvnFixtures.push({\n dvn,\n proxy: dvnProxy,\n admins: dvnAdmins,\n verifiers: verifierSet,\n })\n await eventHandler.addCurrentEventsToAllEvents(dvnMsgResults, dvn)\n }\n\n return [sendDvnFixtures, receiveDvnFixtures]\n}\n\nexport async function deployConfigAndRegisterUln(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n ulnConfigs: UlnConfig,\n version: bigint,\n eventHandler: LzEventHandler,\n dvnConfigs: DvnConfigs\n): Promise<SandboxContract<TonContractWrapper>> {\n // ===================================open and deploy uln manager =====================================\n\n const [msglibManager, ulnManagerMsgResults] = await openAndDeployUlnManagerViaMultisig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture\n )\n await eventHandler.addCurrentEventsToAllEvents(ulnManagerMsgResults, msglibManager)\n srcFixture.msglibManager = msglibManager\n\n // ===================================open and deploy dvn =====================================\n ;[srcFixture.sendDvnFixtures, srcFixture.receiveDvnFixtures] = await deployConfigAndRegisterDvn(\n blockchain,\n allStorages,\n srcFixture,\n eventHandler,\n dvnConfigs\n )\n\n // ===================================open and deploy executor=====================================\n\n const executorAdmins = [srcFixture.owner]\n const [executor, executorProxy, executorMsgResults] = await openAndDeployExecutorAndProxy(\n blockchain,\n allStorages,\n srcFixture,\n executorAdmins\n )\n srcFixture.executorFixtures = {\n executor,\n proxy: executorProxy,\n admins: executorAdmins,\n }\n await eventHandler.addCurrentEventsToAllEvents(executorMsgResults, executor)\n\n // ===================================open and deploy PriceFeedCache & Proxy=======================\n\n const priceFeedCacheAdmins = [srcFixture.owner]\n const [priceFeedCache, priceFeedCacheProxy, priceFeedCacheMsgResults] = await openAndDeployPriceFeedCacheAndProxy(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture.eid,\n priceFeedCacheAdmins\n )\n srcFixture.priceFeedCacheFixtures = new Map([\n [\n dstFixture.eid,\n {\n priceFeedCache,\n proxy: priceFeedCacheProxy,\n admins: priceFeedCacheAdmins,\n },\n ],\n ])\n await eventHandler.addCurrentEventsToAllEvents(priceFeedCacheMsgResults, priceFeedCache)\n\n // ===================================registerUlnWorkerInfo - dvnFeeLib=======================================\n\n let internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(DvnFeelibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================registerUlnWorkerInfo - maliciousFeeLib=======================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(MaliciousFeeLibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ============================registerUlnWorkerInfo - executorFeeLib=======================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(ExecutorFeelibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ============================registerUlnWorkerInfo - priceFeeLib(empty bytes)================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================open and deploy uln =============================================\n\n const [uln, ulnMsgResults] = await openAndDeployUln(\n blockchain,\n allStorages,\n multiSigners,\n await allStorages.getNewMdDeployNewWithExtraInfo({\n initialDeposit: toNano('2'),\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n extraInfo: await allStorages.getNewMdInitUln({\n connectionCode: beginCell().endCell(),\n treasuryFeeBps: 100n, // 100bps todo: turn this into a constant\n }),\n }),\n srcFixture,\n dstFixture.eid\n )\n requireDefined(uln)\n // Initialize Map if it doesn't exist, otherwise preserve existing entries\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (srcFixture.msglib === undefined) {\n srcFixture.msglib = new Map()\n }\n srcFixture.msglib.set(dstFixture.eid, uln)\n await eventHandler.addCurrentEventsToAllEvents(ulnMsgResults, uln)\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstFixture.eid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixtures,\n srcFixture.receiveDvnFixtures,\n dstFixture.eid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n // ===================================addUlnWorker - executor =======================================\n\n const executorWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(executor.address),\n workerFeelibBytecode: cellFromArtifact(ExecutorFeelibArtifact),\n workerFeelibStorage: await allStorages.getNewExecutorFeelib({\n lzReceiveBaseGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n nativeCap: BigInt(0),\n lzComposeBaseGas: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(priceFeedCacheProxy.address),\n dstEid: dstFixture.eid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n const msglib = srcFixture.msglib.get(dstFixture.eid)\n requireDefined(msglib)\n\n internalMsgResults = await addUlnWorker(srcFixture.executorFixtures.admins[0], executor, executorWorkerCallMd, [\n {\n from: srcFixture.executorFixtures.admins[0].address,\n to: executor.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: executor.address,\n to: srcFixture.executorFixtures.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ])\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================addUlnWorker - priceFeedCache =======================================\n\n const priceFeedCacheWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(priceFeedCacheProxy.address),\n workerFeelibBytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n workerFeelibStorage: await allStorages.getNewPriceFeedFeelib({\n // priceRatio: BigInt(0),\n // gasPriceInUnit: BigInt(0),\n // gasPerByte: BigInt(0),\n // nativePriceUsd: BigInt(0),\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n friendWorkerAddress: BigInt(0),\n dstEid: dstFixture.eid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n\n internalMsgResults = await addUlnWorker(\n priceFeedCacheFixture.admins[0],\n priceFeedCache,\n priceFeedCacheWorkerCallMd,\n [\n {\n from: priceFeedCacheFixture.admins[0].address,\n to: priceFeedCache.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: priceFeedCache.address,\n to: priceFeedCacheProxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: priceFeedCacheProxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================configure default send and receive config =====================================\n\n // requireDefined(srcFixture.dvnFixtures)\n // const [reqDvns, optDvns, optThreshold] = getDvnArrayFromDvnFixtures(srcFixture.dvnFixtures, dvnConfig)\n requireDefined(srcFixture.sendDvnFixtures)\n const [reqSendDvns, optSendDvns] = getDvnArrayFromDvnFixtures(srcFixture.sendDvnFixtures, dvnConfigs.send)\n\n const ulnSendConfig = await allStorages.getNewUlnSendConfig({\n workerQuoteGasLimit: ulnConfigs.send.workerQuoteGasLimit,\n maxMessageBytes: ulnConfigs.send.maxMessageBytes,\n executorNull: BigInt(0),\n executor: addressToBigInt(executorProxy.address),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqSendDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optSendDvns),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n })\n\n srcFixture.defaultUlnSendConfig = ulnSendConfig\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG,\n await allStorages.getNewMdMdEid({\n md: ulnSendConfig,\n eid: dstFixture.eid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n ],\n })\n\n requireDefined(srcFixture.receiveDvnFixtures)\n const [reqReceiveDvns, optReceiveDvns, optReceiveQuorum] = getDvnArrayFromDvnFixtures(\n srcFixture.receiveDvnFixtures,\n dvnConfigs.receive\n )\n\n const ulnReceiveConfig = await allStorages.getNewUlnReceiveConfig({\n minCommitPacketGasNull: BigInt(0),\n minCommitPacketGas: ulnConfigs.receive.minCommitPacketGas,\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqReceiveDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optReceiveDvns),\n optionalDVNThreshold: BigInt(optReceiveQuorum),\n })\n\n srcFixture.defaultUlnReceiveConfig = ulnReceiveConfig\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG,\n await allStorages.getNewMdMdEid({\n md: ulnReceiveConfig,\n eid: dstFixture.eid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n ],\n })\n\n return msglibManager\n}\n\nexport async function deployAndRegisterNewUln(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n priceFeedFeeLib: Cell,\n dstEid: bigint,\n dstOApp: SandboxContract<TonContractWrapper>,\n existingDstEid: bigint,\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================open and deploy PriceFeedCache & Proxy=======================\n\n const priceFeedCacheAdmins = [srcFixture.owner]\n const existingPriceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(existingDstEid)\n requireDefined(existingPriceFeedCacheFixture)\n const currentAdminsWorkers = [existingPriceFeedCacheFixture.priceFeedCache]\n\n await registerAdditionalPriceFeedCache(\n blockchain,\n allStorages,\n srcFixture,\n dstEid,\n priceFeedCacheAdmins,\n existingPriceFeedCacheFixture.proxy,\n priceFeedFeeLib,\n currentAdminsWorkers\n )\n\n // ===================================open and deploy uln =============================================\n\n const [uln, ulnMsgResults] = await openAndDeployUln(\n blockchain,\n allStorages,\n multiSigners,\n await allStorages.getNewMdDeployNewWithExtraInfo({\n initialDeposit: toNano('2'),\n dstEid,\n dstOApp: addressToBigInt(dstOApp.address),\n extraInfo: await allStorages.getNewMdInitUln({\n connectionCode: beginCell().endCell(),\n treasuryFeeBps: 100n, // 100bps todo: turn this into a constant\n }),\n }),\n srcFixture,\n dstEid\n )\n srcFixture.msglib.set(dstEid, uln)\n await eventHandler.addCurrentEventsToAllEvents(ulnMsgResults, uln)\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstEid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixtures,\n srcFixture.receiveDvnFixtures,\n dstEid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n // ===================================addUlnWorker - executor =======================================\n\n const executorWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(srcFixture.executorFixtures.executor.address),\n workerFeelibBytecode: cellFromArtifact(ExecutorFeelibArtifact),\n workerFeelibStorage: await allStorages.getNewExecutorFeelib({\n lzReceiveBaseGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n nativeCap: BigInt(0),\n lzComposeBaseGas: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(existingPriceFeedCacheFixture.proxy.address),\n dstEid: dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n const msglib = srcFixture.msglib.get(dstEid)\n requireDefined(msglib)\n\n let internalMsgResults = await addUlnWorker(\n srcFixture.executorFixtures.admins[0],\n srcFixture.executorFixtures.executor,\n executorWorkerCallMd,\n [\n {\n from: srcFixture.executorFixtures.admins[0].address,\n to: srcFixture.executorFixtures.executor.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.executor.address,\n to: srcFixture.executorFixtures.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================addUlnWorker - priceFeedCache =======================================\n\n const priceFeedCacheWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(existingPriceFeedCacheFixture.proxy.address),\n workerFeelibBytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n workerFeelibStorage: await allStorages.getNewPriceFeedFeelib({\n // priceRatio: BigInt(0),\n // gasPriceInUnit: BigInt(0),\n // gasPerByte: BigInt(0),\n // nativePriceUsd: BigInt(0),\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n friendWorkerAddress: BigInt(0),\n dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n\n internalMsgResults = await addUlnWorker(\n priceFeedCacheFixture.admins[0],\n priceFeedCacheFixture.priceFeedCache,\n priceFeedCacheWorkerCallMd,\n [\n {\n from: priceFeedCacheFixture.admins[0].address,\n to: priceFeedCacheFixture.priceFeedCache.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: priceFeedCacheFixture.priceFeedCache.address,\n to: priceFeedCacheFixture.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: priceFeedCacheFixture.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================configure default send and receive config =====================================\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG,\n await allStorages.getNewMdMdEid({\n md: srcFixture.defaultUlnSendConfig,\n eid: dstEid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n ],\n })\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG,\n await allStorages.getNewMdMdEid({\n md: srcFixture.defaultUlnReceiveConfig,\n eid: dstEid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n ],\n })\n}\n\nexport async function wireFixtureWithUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n ulnConfigCustom?: UlnConfig,\n dvnConfigsCustom?: DvnConfigs\n): Promise<void> {\n // ===================================wire channels=====================================\n\n await wireChannels(blockchain, allStorages, srcFixture, dstFixture, eventHandler)\n\n // ===================================default config =====================================\n\n const ulnConfigDefault: UlnConfig = {\n send: {\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(100000000),\n },\n receive: {\n minCommitPacketGas: BigInt(1),\n },\n }\n\n const dvnConfigsDefault: DvnConfigs = {\n send: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n },\n receive: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n optDvnQuorum: 0n,\n },\n }\n\n // ===================================deploy, configue, and register uln =====================================\n\n srcFixture.msglibManager = await deployConfigAndRegisterUln(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n ulnConfigCustom ?? ulnConfigDefault,\n ULN_MANAGER_DEFAULT_VERSION,\n eventHandler,\n dvnConfigsDefault\n )\n\n // ===================================add msg lib to controller =====================================\n\n let internalMsgResults = await addMsgLibToController(\n blockchain,\n multiSigners,\n srcFixture,\n dstFixture,\n srcFixture.msglibManager\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // ===================================open and deploy uln connection =====================================\n\n const [msglibConnection, ulnConnectionMsgResults] = await openAndDeployUlnConnection(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture\n )\n srcFixture.msglibConnection = msglibConnection\n await eventHandler.addCurrentEventsToAllEvents(ulnConnectionMsgResults, srcFixture.oApp)\n\n // ===================================set default endpoint config=====================================\n\n internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // expect no failures\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n if (dvnConfigsCustom) {\n // ===================================open and deploy dvn =====================================\n\n ;[srcFixture.sendDvnFixturesCustom, srcFixture.receiveDvnFixturesCustom] = await deployConfigAndRegisterDvn(\n blockchain,\n allStorages,\n srcFixture,\n eventHandler,\n dvnConfigsCustom\n )\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstFixture.eid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixturesCustom,\n srcFixture.receiveDvnFixturesCustom,\n dstFixture.eid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n const [reqSendDvns, optSendDvns] = getDvnArrayFromDvnFixtures(\n srcFixture.sendDvnFixturesCustom,\n dvnConfigsCustom.send\n )\n\n const ulnSendConfig = await allStorages.getNewUlnSendConfig({\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(1000000000),\n executorNull: BigInt(0),\n executor: addressToBigInt(srcFixture.executorFixtures.proxy.address),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqSendDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optSendDvns),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n })\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_SetLzConfig,\n md: await allStorages.getNewLzConfig({\n path: srcFixture.path,\n forwardingAddress: addressToBigInt(srcFixture.msglibManager.address),\n opCode: OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_SEND_CONFIG as bigint,\n config: ulnSendConfig,\n }),\n balanceRefill: toNano('1'),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_SetLzConfig),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_SEND_CONFIG),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_SET_OAPP_ULN_SEND_CONFIG),\n success: true,\n },\n ],\n })\n\n const [reqReceiveDvns, optReceiveDvns, optReceiveQuorum] = getDvnArrayFromDvnFixtures(\n srcFixture.receiveDvnFixturesCustom,\n dvnConfigsCustom.receive\n )\n\n const ulnReceiveConfig = await allStorages.getNewUlnReceiveConfig({\n minCommitPacketGasNull: BigInt(0),\n minCommitPacketGas: BigInt(1),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqReceiveDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optReceiveDvns),\n optionalDVNThreshold: BigInt(optReceiveQuorum),\n })\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_SetLzConfig,\n md: await allStorages.getNewLzConfig({\n path: srcFixture.path,\n forwardingAddress: addressToBigInt(srcFixture.msglibManager.address),\n opCode: OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_RECEIVE_CONFIG as bigint,\n config: ulnReceiveConfig,\n }),\n balanceRefill: toNano('1'),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_SetLzConfig),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_RECEIVE_CONFIG),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_SET_OAPP_ULN_RECEIVE_CONFIG),\n success: true,\n },\n ],\n })\n }\n}\n\nexport async function wireFixturesTogetherWithUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n customConfigs?: CustomConfigs\n): Promise<void> {\n await wireFixtureWithUln(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture,\n dstFixture,\n eventHandler,\n customConfigs?.ulnConfig,\n customConfigs?.dvnConfig?.src\n )\n await wireFixtureWithUln(\n blockchain,\n allStorages,\n multiSigners,\n dstFixture,\n srcFixture,\n eventHandler,\n customConfigs?.ulnConfig,\n customConfigs?.dvnConfig?.dst\n )\n}\n\n// ========================================================= DVN =========================================================\n\nexport const dvnSetupGas = {\n 'Dvn.INITIALIZE': toNano('10'), // 0.235917\n 'Dvn.SET_VERIFIERS': toNano('10'), // 0.235917\n 'Dvn.SET_QUORUM': toNano('10'), // 0.235917\n 'Dvn.SET_ADMINS_BY_QUORUM': toNano('10'), // 0.235917\n 'Dvn.SET_DICT': toNano('10'), // 0.235917\n 'Dvn.SEND_SIGNED_REQUEST': toNano('10'), // 0.235917\n}\n\nexport async function createAdminDictSet(\n admins: SandboxContract<TreasuryContract | TonContractWrapper>[],\n wrapper: ExtendedContract<TonContractWrapper>\n): Promise<Cell> {\n const adminDict = LzDict.empty()\n for (const admin of admins) {\n await adminDict.set(addressToBigInt(admin.address), beginCell().endCell(), wrapper)\n }\n return adminDict.asCell()\n}\n\nexport async function createSignatures(\n hash: Buffer,\n verifiers: ethers.Wallet[],\n wrapper: ExtendedContract<TonContractWrapper>\n): Promise<Cell> {\n const signatures = LzDict.empty()\n for (const verifier of verifiers) {\n // doing this one insted of .signMessage() to not sign with the \"Ethereum\" prefix\n const signature = verifier._signingKey().signDigest(hash)\n const signatureBytes = ethers.utils.splitSignature(signature)\n const signatureBytesArray = new Uint8Array([\n ...ethers.utils.arrayify(signatureBytes.r),\n ...ethers.utils.arrayify(signatureBytes.s),\n signatureBytes.v,\n ])\n\n await signatures.set(\n publicKeyToHash(verifier.publicKey),\n beginCell().storeBuffer(Buffer.from(signatureBytesArray), SIGNATURE_BYTE_LENGTH).endCell(),\n wrapper\n )\n\n // Sanity Check: Attempt to recover the public key from the signature\n // const messageHash = ethers.utils.arrayify(hash)\n // try {\n // const recoveredPublicKey = ethers.utils.recoverPublicKey(messageHash, signatureBytes)\n // const originalPublicKey = verifier.publicKey\n\n // console.log(\\`Verifier:\\`)\n // console.log(\\`Original public key: \\${originalPublicKey}\\`)\n // console.log(\\`Recovered public key: \\${recoveredPublicKey}\\`)\n\n // if (recoveredPublicKey.toLowerCase() === originalPublicKey.toLowerCase()) {\n // console.log('Public key successfully recovered!')\n // } else {\n // console.log('Public key recovery failed.')\n // }\n // } catch (error) {\n // console.error(\\`Error recovering public key for verifier:\\`, error)\n // }\n }\n return signatures.asCell()\n}\n\n// ================================DVN: SEND REQUEST================================\n\ninterface SignAndSendRequestToDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n request: Cell\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n}\n\nexport async function signAndSendRequestToDvn({\n dvn,\n request,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions = [],\n}: SignAndSendRequestToDvnParams): Promise<SendMessageResult> {\n const signedRequest = await allStorages.getNewMdSignedRequest({\n request,\n signatures: await createSignatures(request.hash(), verifierSet, allStorages),\n })\n\n return sendInternalMessageAndExpect({\n value: dvnSetupGas['Dvn.SEND_SIGNED_REQUEST'],\n sender: caller.getSender(),\n contract: dvn as SandboxContract<TonContractWrapper>,\n opCode: incomingOpcode,\n md: signedRequest,\n expectedTransactions,\n })\n}\n\ninterface SetDictOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n newDict: Cell\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n nonce: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n target: bigint\n}\n\nexport async function setDictOnDvn({\n dvn,\n newDict,\n verifierSet,\n caller,\n signedOpcode,\n incomingOpcode,\n nonce,\n target,\n allStorages,\n expectedTransactions = [],\n}: SetDictOnDvnParams): Promise<SendMessageResult> {\n const setDictMd = await dvn.getNewMdSetDict({\n nonce,\n opcode: signedOpcode,\n _dict: newDict,\n target,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: setDictMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\ninterface AssertNewDictParams {\n dvn: ExtendedContract<TonContractWrapper>\n newDict: Cell\n}\n\nexport async function assertNewVerifiers({ dvn, newDict: expectedVerifiers }: AssertNewDictParams): Promise<void> {\n // check that the verifiers are set correctly (checking the hash is enough)\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n expect(dvnStorage.verifiers.asCell().hash()).toEqual(expectedVerifiers.hash())\n}\n\n// ================================DVN QUORUM================================\n\ninterface SetQuorumOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n newQuorum: bigint\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n nonce: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n target: bigint\n}\n\nexport async function setQuorumOnDvn({\n dvn,\n newQuorum,\n verifierSet,\n caller,\n incomingOpcode,\n signedOpcode,\n nonce,\n allStorages,\n expectedTransactions,\n target,\n}: SetQuorumOnDvnParams): Promise<SendMessageResult> {\n const setQuorumMd = await dvn.getNewMdSetQuorum({\n nonce,\n opcode: signedOpcode,\n quorum: newQuorum,\n target,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: setQuorumMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\nexport async function getDvnQuorum(dvn: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n return dvnStorage.quorum\n}\n\ninterface AssertNewQuorumParams {\n dvn: ExtendedContract<TonContractWrapper>\n expectedQuorum: bigint\n}\n\nexport async function assertNewQuorum({ dvn, expectedQuorum }: AssertNewQuorumParams): Promise<void> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n expect(dvnStorage.quorum).toEqual(expectedQuorum)\n}\n\n// ================================DVN ADMINS================================\n\nexport async function assertNewDvnAdmins({ dvn, newDict: expectedAdmins }: AssertNewDictParams): Promise<void> {\n // check that the admins are set correctly (checking the hash is enough)\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n const coreDvnStorageCell = dvnStorage.workerCoreStorage\n const coreDvnStorage = await TonObjectUnwrapper.getWorkerCoreStorageToTS(dvn, coreDvnStorageCell)\n expect(coreDvnStorage.admins.hash()).toEqual(expectedAdmins.hash())\n}\n\n// ================================DVN NONCES================================\n\nexport async function getDvnNonces(dvn: ExtendedContract<TonContractWrapper>): Promise<{\n setQuorumNonce: bigint\n setVerifiersNonce: bigint\n setAdminsByQuorumNonce: bigint\n}> {\n const storageCell = await dvn.getCurrentStorageCell()\n const dvnToTs = await TonObjectUnwrapper.getDvnToTS(dvn, storageCell)\n return {\n setQuorumNonce: dvnToTs.setQuorumNonce,\n setVerifiersNonce: dvnToTs.setVerifiersNonce,\n setAdminsByQuorumNonce: dvnToTs.setAdminsByQuorumNonce,\n }\n}\n\ninterface AssertNonceSetParams {\n dvn: ExtendedContract<TonContractWrapper>\n whichNonce: 'setVerifiersNonce' | 'setQuorumNonce' | 'setAdminsByQuorumNonce'\n expectedNonce: bigint\n}\n\nexport async function assertNewNonce({ dvn, whichNonce, expectedNonce }: AssertNonceSetParams): Promise<void> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n\n switch (whichNonce) {\n case 'setVerifiersNonce':\n expect(dvnStorage.setVerifiersNonce).toEqual(expectedNonce)\n break\n case 'setQuorumNonce':\n expect(dvnStorage.setQuorumNonce).toEqual(expectedNonce)\n break\n case 'setAdminsByQuorumNonce':\n expect(dvnStorage.setAdminsByQuorumNonce).toEqual(expectedNonce)\n break\n default:\n // Use a type assertion to ensure whichNonce is treated as a string\n throw new Error(\\`Unknown nonce type: \\${whichNonce as string}\\`)\n }\n}\n\ninterface CallVerifyOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n expiration: bigint\n target: bigint\n callData: Cell\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n forwardingAddress: bigint\n}\n\nexport async function callVerifyOnDvn({\n dvn,\n verifierSet,\n caller,\n incomingOpcode,\n signedOpcode,\n expiration,\n target,\n callData,\n allStorages,\n expectedTransactions,\n forwardingAddress,\n}: CallVerifyOnDvnParams): Promise<SendMessageResult> {\n const executeParamsMd = await dvn.getNewMdExecuteParams({\n expiration,\n target,\n callData,\n opcode: signedOpcode,\n forwardingAddress,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: executeParamsMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\nexport async function ulnVerifyAndExpect(\n allStorages: SandboxContract<TonContractWrapper>,\n mdPacketSent: MdPacketSent,\n msglib: SandboxContract<TonContractWrapper>,\n receiveDvnFixtures: DvnFixture[],\n msglibManager: SandboxContract<TonContractWrapper>,\n msglibConnection: SandboxContract<TonContractWrapper>,\n eventHandler: LzEventHandler,\n confirmations = 1n,\n profile?: Profile\n): Promise<Cell> {\n const oneDayFromNow = BigInt(Math.floor(Date.now() / 1000) + 86400)\n\n const lzPacket = await createLzPacketFromPacketEncoded(mdPacketSent.packetEncoded, allStorages)\n for (const { dvn, proxy, admins, verifiers } of receiveDvnFixtures) {\n const requestMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(dvn.address),\n callData: await allStorages.getNewMdMdAddress({\n md: await allStorages.getNewMdUlnVerification({\n nonce: mdPacketSent.nonce,\n hash: BigInt('0x' + lzPacket.hash().toString('hex')),\n confirmations,\n }),\n address: addressToBigInt(msglibConnection.address),\n }),\n expiration: oneDayFromNow,\n opcode: OPCODES.Uln_OP_ULN_VERIFY,\n forwardingAddress: addressToBigInt(msglib.address),\n })\n\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: admins[0].getSender(),\n contract: dvn,\n opCode: OPCODES.Dvn_OP_VERIFY,\n md: await allStorages.getNewMdSignedRequest({\n request: requestMd,\n signatures: await createSignatures(requestMd.hash(), verifiers, allStorages),\n }),\n expectedTransactions: [\n {\n from: admins[0].address,\n to: dvn.address,\n op: Number(OPCODES.Dvn_OP_VERIFY),\n success: true,\n },\n {\n from: dvn.address,\n to: proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: proxy.address,\n to: msglib.address,\n op: Number(OPCODES.Uln_OP_ULN_VERIFY),\n success: true,\n },\n {\n from: msglib.address,\n to: msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_ULN_CONNECTION_VERIFY),\n success: true,\n },\n // emit UlnConnection::EVENT::PACKET_VERIFIED\n {\n from: msglibConnection.address,\n to: msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: msglibConnection.address,\n to: proxy.address,\n op: Number(OPCODES.UltraLightNode_OP_ULN_CONNECTION_VERIFY_CALLBACK),\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, dvn)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n }\n\n return lzPacket\n}\n\nexport async function registerAdditionalPriceFeedCache(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstEid: bigint,\n adminSet: SandboxContract<TreasuryContract>[],\n existingProxy: SandboxContract<TonContractWrapper>,\n priceFeedFeeLib: Cell,\n currentAdminsWorkers: SandboxContract<TonContractWrapper>[]\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // Create new price feed cache worker\n const priceFeedCache = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(PriceFeedCacheArtifact),\n await allStorages.getNewPriceFeedCache({\n admins: serializeAddressList(adminSet),\n version: 0n,\n dstEid,\n priceFeedFeeLib,\n })\n )\n )\n\n // 1) Deploy the worker\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: priceFeedCache,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: priceFeedCache.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 2) Update proxy admins list (including the new worker)\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: existingProxy,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: existingProxy.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_ADMINS,\n md: serializeAddressList([...currentAdminsWorkers, priceFeedCache]),\n balanceRefill: toNano('0'),\n })\n\n // 3) Set proxy on worker\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: priceFeedCache,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: priceFeedCache.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_PROXY,\n md: await allStorages.getNewMdSetAddress({\n address: addressToBigInt(existingProxy.address),\n }),\n balanceRefill: toNano('0'),\n })\n\n srcFixture.priceFeedCacheFixtures.set(dstEid, {\n priceFeedCache,\n proxy: existingProxy,\n admins: [...adminSet],\n })\n\n return [priceFeedCache, internalMsgResults]\n}\n\nexport async function wireFixtureWithNewUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================default config =====================================\n\n const ulnConfigDefault: UlnConfig = {\n send: {\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(100000000),\n },\n receive: {\n minCommitPacketGas: BigInt(1),\n },\n }\n\n const dvnConfigsDefault: DvnConfigs = {\n send: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n },\n receive: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n optDvnQuorum: 0n,\n },\n }\n\n // ===================================deploy, configue, and register uln =====================================\n\n srcFixture.msglibManager = await deployConfigAndRegisterUln(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n ulnConfigDefault,\n ULN_MANAGER_DEFAULT_VERSION,\n eventHandler,\n dvnConfigsDefault\n )\n\n // ===================================add msg lib to controller =====================================\n\n let internalMsgResults = await addMsgLibToController(\n blockchain,\n multiSigners,\n srcFixture,\n dstFixture,\n srcFixture.msglibManager\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // ===================================set default endpoint config=====================================\n\n internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // expect no failures\n expect(eventHandler.allFailures.txList).toHaveLength(0)\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\nexport function setLzTonSdkWriteToConsole(enabled: boolean): void {\n process.env.LZ_TON_SDK_WRITE_TO_CONSOLE = enabled.toString()\n}\n\nexport function setLzTonSdkSaveToJson(enabled: boolean): void {\n process.env.LZ_TON_SDK_SAVE_TO_JSON = enabled.toString()\n}\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 writeToConsole?: boolean\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 let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n\n // Use environment variables if profile flags are not set\n const shouldProfileGas = profile?.profileGas ?? process.env.LZ_TON_SDK_SAVE_TO_JSON === 'true'\n const shouldWriteToConsole = profile?.writeToConsole ?? process.env.LZ_TON_SDK_WRITE_TO_CONSOLE === 'true'\n\n if (shouldProfileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile?.fileName ?? 'gasInfo'}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n\n if (shouldWriteToConsole) {\n console.info(callerStack?.split('\\n')[2].trim())\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\n ? 'UNKNOWN'\n : 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 (shouldProfileGas) 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 }\n if (shouldProfileGas) sortAndSave(filePath, gasInfo)\n}\n","import { Cell, Contract, SendMode, beginCell } 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 { ClasslibWrapper } from './ClasslibWrapper'\nimport { MultiSigOpCodes, Multisig, Order, TransferRequest } from './externalWrappers'\nimport { Profile, printTransactionTrace } from './print-tx-trace'\n\nexport interface SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<ClasslibWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n recursiveDecode?: boolean\n txDecoder?: (contract: SandboxContract<ClasslibWrapper>, internalMsgResults: SendMessageResult) => Promise<void>\n invertedOpcodes?: { [k: string]: string }\n}\n\nexport interface SendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<Contract | ClasslibWrapper>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n recursiveDecode?: boolean\n txDecoder?: (contract: SandboxContract<ClasslibWrapper>, internalMsgResults: SendMessageResult) => Promise<void>\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n recursiveDecode = false,\n txDecoder,\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 (targetContract.init === undefined) {\n throw new Error('targetContract.init is undefined')\n }\n\n if (deploy) {\n const targetContractStateInit = beginCell()\n .storeUint(6, 5)\n .storeRef(targetContract.init!.code ?? beginCell().endCell())\n .storeRef(targetContract.init!.data ?? beginCell().endCell())\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 // that makes sure that the target contract is a sandbox<TonContractWrapper>\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract && txDecoder) {\n await txDecoder(targetContract, internalMsgResults)\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 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 as any).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 as any).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract && txDecoder) {\n await txDecoder(targetContract, internalMsgResults)\n }\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 recursiveDecode = false,\n txDecoder,\n invertedOpcodes,\n}: SendInternalMessageAndExpectArgs): Promise<SendMessageResult> {\n const internalMsgResults = await contract.sendInternalMessage(sender, opCode, md, { value }, balanceRefill, queryId)\n\n if (profile?.profileGas ?? false) {\n const { stack } = new Error()\n printTransactionTrace(internalMsgResults.transactions, invertedOpcodes ?? {}, stack, profile)\n }\n\n if (recursiveDecode && txDecoder) {\n await txDecoder(contract, internalMsgResults)\n }\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 // Use type assertion\n expect(actualTransactions).toHaveTransaction(tx)\n })\n}\n","import { Cell, beginCell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox'\n\nimport { ClasslibWrapper } from './ClasslibWrapper'\nimport { sendInternalMessageAndExpect } from './send-tx'\nimport { BlueprintArtfiact, cellFromArtifact } from './utils'\n\nexport async function openAndDeployAllStoragesTemplate(\n blockchain: Blockchain,\n deployer: SandboxContract<TreasuryContract>,\n artifact: BlueprintArtfiact,\n gasValue: bigint,\n opCode: bigint,\n md: Cell\n): Promise<SandboxContract<ClasslibWrapper>> {\n // ===================================open allStorages=====================================\n\n const allStorages = blockchain.openContract(\n ClasslibWrapper.create(cellFromArtifact(artifact), beginCell().endCell())\n )\n\n // ===================================deploy allStorages=====================================\n\n await sendInternalMessageAndExpect({\n value: gasValue,\n sender: deployer.getSender(),\n contract: allStorages,\n expectedTransactions: [\n {\n from: deployer.address,\n to: allStorages.address,\n deploy: true,\n success: true,\n },\n ],\n opCode,\n md,\n balanceRefill: toNano('1'),\n })\n\n return allStorages\n}\n","import { KeyPair, deriveEd25519Path, keyPairFromSeed, mnemonicToHDSeed, mnemonicToWalletKey } from '@ton/crypto'\nimport { WalletContractV4 } from '@ton/ton'\n\nexport function toPathArray(path: string): number[] {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"')\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/')\n const ret: number[] = Array<number>(parts.length)\n for (let i = 0; i < parts.length; i++) {\n const tmp = /^(\\d{1,10})[hH']$/.exec(parts[i])\n if (tmp === null) {\n throw new Error('Invalid input')\n }\n ret[i] = parseInt(tmp[1], 10)\n\n if (ret[i] >= 0x80000000) {\n throw new Error('Invalid child index')\n }\n }\n return ret\n}\n\nexport async function getTonWalletFromMnemonic(\n mnemonic: string,\n path = \"m/44'/607'/0'/0'/0'\",\n workchain = 0\n): Promise<{ wallet: WalletContractV4; keyPair: KeyPair }> {\n const seed: Buffer = await mnemonicToHDSeed(mnemonic.split(' '))\n const indices: number[] = toPathArray(path)\n const derivedSeed: Buffer = await deriveEd25519Path(seed, indices)\n const keyPair: KeyPair = keyPairFromSeed(derivedSeed)\n return {\n wallet: WalletContractV4.create({\n publicKey: keyPair.publicKey,\n workchain,\n }),\n keyPair,\n }\n}\n\n// Legacy method that should match TonKeeper mnemonic derivation\nexport const getTonWalletFromMnemonicLegacy = async (\n mnemonic: string,\n workchain = 0\n): Promise<{ wallet: WalletContractV4; keyPair: KeyPair }> => {\n const key = await mnemonicToWalletKey(mnemonic.split(' '))\n const wallet = WalletContractV4.create({\n publicKey: key.publicKey,\n workchain,\n })\n return { wallet, keyPair: key }\n}\n","import { BitBuilder, BitString, Builder, Cell, beginCell } from '@ton/core'\n\nimport { MAX_CELL_BITS } from './class/class'\nimport { trim0x } from '../../address-utils'\n\nexport const hexToCells = (hex: string): Cell => {\n const bitString = new BitString(Buffer.from(trim0x(hex), 'hex'), 0, hex.slice(2).length * 4)\n\n const cells: Builder[] = []\n\n let offset = 0\n while (offset < bitString.length) {\n cells.push(beginCell())\n cells[cells.length - 1].storeBits(\n bitString.substring(offset, Math.min(bitString.length - offset, MAX_CELL_BITS))\n )\n offset += MAX_CELL_BITS\n }\n\n if (cells.length === 0) {\n return beginCell().asCell()\n }\n\n cells.reverse()\n\n return cells\n .slice(1)\n .reduce((children, parent) => parent.storeRef(children), cells[0])\n .asCell()\n}\n\nexport const getTotalBits = (cell: Cell): number => {\n const parser = cell.beginParse()\n\n return parser.remainingBits + (parser.remainingRefs > 0 ? getTotalBits(parser.loadRef()) : 0)\n}\n\nexport const getClosestByteAlignedBits = (bits: number): number => {\n return Math.ceil(bits / 8) * 8\n}\n\nexport const cellsToHex = (cell: Cell): string => {\n let parser = cell.beginParse()\n\n const totalBits = getClosestByteAlignedBits(getTotalBits(cell))\n const bitBuilder = new BitBuilder(totalBits)\n\n while (parser.remainingRefs >= 0) {\n const bitsString = parser.loadBits(parser.remainingBits)\n bitBuilder.writeBits(bitsString)\n\n if (parser.remainingRefs === 0) {\n break\n }\n\n parser = parser.loadRef().beginParse()\n }\n\n return `0x${bitBuilder.buffer().toString('hex')}`\n}\n\nexport const calculateCellConsumption = (cell: Cell): { numberOfCells: number; bits: number } => {\n let parser = cell.beginParse()\n\n let numberOfCells = 1\n let bits = parser.remainingBits\n\n while (parser.remainingRefs > 0) {\n parser = parser.loadRef().beginParse()\n numberOfCells++\n bits += parser.remainingBits\n }\n\n return { numberOfCells, bits }\n}\n\nexport const calculateCellConsumptionFromHex = (hex: string): { numberOfCells: number; bits: number } => {\n return calculateCellConsumption(hexToCells(hex))\n}\n","import { Address, Cell, Dictionary, DictionaryKeyTypes, DictionaryValue, beginCell } from '@ton/core'\n\nimport {\n AddressListTypeLike,\n AddressTypeLike,\n BoolTypeLike,\n ClDeclareField,\n ClassTypeLike,\n DecodedAndRaw,\n DictionaryTypeLike,\n NumberTypeLike,\n _getTypeWidth,\n cl,\n clDeclare,\n clGetCellRef,\n clGetUint,\n} from './class'\nimport {\n asciiStringToBigint,\n deserializeAddressList,\n emptyCell,\n emptyPOOO,\n getCellName,\n serializeAddressList,\n} from './helpers'\nimport { bigIntToHex, bigintToAddress } from '../../../address-utils'\nimport { cellsToHex } from '../cells'\n\nconst baseObjects = {\n POOO: {\n '0': {\n fieldName: 'POOO::nextEmpty',\n fieldType: 'cl::t::uint64',\n },\n '1': {\n fieldName: 'POOO::bitmap',\n fieldType: 'cl::t::cellRef',\n },\n name: 'POOO',\n },\n BaseStorage: {\n '0': {\n fieldName: 'BaseStorage::owner',\n fieldType: 'cl::t::address',\n },\n '1': {\n fieldName: 'BaseStorage::authenticated',\n fieldType: 'cl::t::bool',\n },\n '2': {\n fieldName: 'BaseStorage::initialized',\n fieldType: 'cl::t::bool',\n },\n '3': {\n fieldName: 'BaseStorage::initialStorage',\n fieldType: 'cl::t::cellRef',\n },\n name: 'baseStore',\n },\n 'action::event': {\n '0': {\n fieldName: 'action::event::topic',\n fieldType: 'cl::t::uint256',\n },\n '1': {\n fieldName: 'action::event::body',\n fieldType: 'cl::t::objRef',\n },\n '2': {\n fieldName: 'action::event::initialStorage',\n fieldType: 'cl::t::objRef',\n },\n name: 'event',\n },\n} as const\n\nexport type ValueOf<T> = T[keyof T]\n\nexport const fieldTypes = [\n 'cl::t::uint1', // 1 bit\n 'cl::t::bool', // 1 bit\n 'cl::t::uint2', // 2 bits\n 'cl::t::uint4', // 4 bits\n 'cl::t::uint8', // 8 bits\n 'cl::t::uint16', // 16 bits\n 'cl::t::uint32', // 32 bits\n 'cl::t::uint64', // 64 bits\n 'cl::t::uint128', // 128 bits\n 'cl::t::coins', // 128 bits\n 'cl::t::uint256', // 256 bits\n 'cl::t::address', // 256 bits\n 'cl::t::dict256', // cell\n 'cl::t::cellRef', // cell\n 'cl::t::objRef', // cell\n 'cl::t::addressList', // cell\n] as const\n\nexport interface TonObjects {\n [key: string]: {\n name: string\n } & {\n [key in `${number}`]: {\n fieldName: string\n // eslint-disable-next-line no-use-before-define\n fieldType: FieldTypes<TonObjects>\n }\n }\n}\nexport type TonObjectsKeys<_TonObjects extends TonObjects> = keyof _TonObjects & string\n\nexport type FieldTypes<_TonObjects extends TonObjects> = (typeof fieldTypes)[number] | TonObjectsKeys<_TonObjects>\n\nexport type ClassDefinition<_TonObjects extends TonObjects, ClassName extends TonObjectsKeys<_TonObjects>> = Omit<\n _TonObjects[ClassName],\n 'name'\n>\n\nexport type EnhancedAddress = Address & {\n toHex: () => string\n toBigInt: () => bigint\n}\nexport type EnhancedAddressList = EnhancedAddress[] & {\n toHex: () => string[]\n toBigInt: () => bigint[]\n}\n\nexport type EnhancedCell<_TonObjects extends TonObjects> = Cell & {\n getAddressList: () => EnhancedAddressList\n cellsToHex: () => string\n getDict: <V>(valueType: DictionaryValue<V>) => Dictionary<bigint, V>\n decode: <ClassName extends TonObjectsKeys<_TonObjects>>(\n className: ClassName\n // eslint-disable-next-line no-use-before-define\n ) => Fields<_TonObjects, ClassName>\n clGetCellRef: (index: number) => EnhancedCell<_TonObjects>\n clGetUint: (index: number, width: number) => bigint\n getCellName: () => string\n}\n\nexport type LoadableDict<_TonObjects extends TonObjects> = DecodedAndRaw<\n {\n getDict: <V>(valueType: DictionaryValue<V>) => Dictionary<bigint, V>\n },\n EnhancedCell<_TonObjects>\n>\n\nexport type FieldTypeToValue<\n _TonObjects extends TonObjects,\n FieldType,\n ClassType extends ClassTypeLike | EnhancedCell<_TonObjects>,\n NumberType extends NumberTypeLike,\n BoolType extends BoolTypeLike,\n AddressType extends AddressTypeLike,\n AddressListType extends AddressListTypeLike,\n DictionaryType extends DictionaryTypeLike<any>,\n> =\n FieldType extends TonObjectsKeys<_TonObjects>\n ? // The following ternary is to decide between the type used on decode/lzEncodeClass\n [ClassTypeLike] extends [ClassType]\n ? // eslint-disable-next-line no-use-before-define\n Fields<_TonObjects, FieldType, ClassType, NumberType, BoolType, AddressType, AddressListType> | ClassType\n : DecodedAndRaw<\n // eslint-disable-next-line no-use-before-define\n Fields<_TonObjects, FieldType, ClassType, NumberType, BoolType, AddressType, AddressListType>,\n EnhancedCell<_TonObjects>\n >\n : FieldType extends 'cl::t::cellRef' | 'cl::t::objRef'\n ? ClassType\n : FieldType extends 'cl::t::bool'\n ? BoolType\n : FieldType extends 'cl::t::address'\n ? AddressType\n : FieldType extends 'cl::t::addressList'\n ? AddressListType\n : FieldType extends 'cl::t::dict256'\n ? DictionaryType\n : NumberType\n\nexport type Fields<\n _TonObjects extends TonObjects,\n ClassName extends TonObjectsKeys<_TonObjects>,\n ClassType extends ClassTypeLike | EnhancedCell<_TonObjects> = EnhancedCell<_TonObjects>,\n NumberType extends NumberTypeLike = bigint,\n BoolType extends BoolTypeLike = boolean,\n AddressType extends AddressTypeLike = EnhancedAddress,\n AddressListType extends AddressListTypeLike = EnhancedAddressList,\n DictionaryType extends DictionaryTypeLike<any> = LoadableDict<_TonObjects>,\n> =\n ValueOf<ClassDefinition<_TonObjects, ClassName>> extends {\n fieldName: string\n fieldType: FieldTypes<_TonObjects>\n }\n ? {\n [K in ValueOf<\n ClassDefinition<_TonObjects, ClassName>\n > as K['fieldName'] extends `${ClassName}::${infer PropName}` ? PropName : never]: FieldTypeToValue<\n _TonObjects,\n K['fieldType'],\n ClassType,\n NumberType,\n BoolType,\n AddressType,\n AddressListType,\n DictionaryType\n >\n }\n : never\n\nexport const isClassName = <_TonObjects extends TonObjects>(\n _tonObjects: _TonObjects,\n fieldType: FieldTypes<_TonObjects>\n): fieldType is TonObjectsKeys<_TonObjects> => {\n return fieldType in _tonObjects\n}\n\nconst getClassNameAndDefinition =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName\n ): {\n className: ClassName\n classDefinition: (typeof _tonObjects)[ClassName]\n } => {\n let className = _className\n let classDefinition = _tonObjects[className]\n\n // When deep decoding a class that you don't have the whole definition for\n // you can pass the name of the class definition instead of the class name.\n // This works because the first bits of the class are the name itself, so it\n // allows us to decode the class without the full definition.\n if (!(className in _tonObjects)) {\n ;[className, classDefinition] = Object.entries(_tonObjects).find(\n ([_, value]) => value.name === className\n )! as [ClassName, (typeof _tonObjects)[ClassName]]\n throw new Error(`Class ${className} not found`)\n }\n\n return { className, classDefinition }\n }\n\nexport const generateEncodeClass =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName,\n fields: Fields<\n _TonObjects,\n ClassName,\n ClassTypeLike,\n NumberTypeLike,\n BoolTypeLike,\n AddressTypeLike,\n AddressListTypeLike,\n DictionaryTypeLike<any>\n >\n ): Cell => {\n const { className, classDefinition } = getClassNameAndDefinition(_tonObjects)(_className)\n\n const fieldsArray = Object.entries(classDefinition).filter(([_, field]) => typeof field !== 'string') as [\n string,\n { fieldName: string; fieldType: FieldTypes<_TonObjects> },\n ][]\n\n const results = Object.entries(fields)\n .map(([fieldName, fieldValue]) => {\n const [index, field] = fieldsArray.find(\n ([_, field]) => field.fieldName === `${className}::${fieldName}`\n )!\n\n if (field.fieldType === 'cl::t::dict256' && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n (fieldValue as Partial<LoadableDict<_TonObjects>>).rawCell ??\n beginCell()\n .storeDict(fieldValue as Dictionary<DictionaryKeyTypes, unknown>)\n .endCell()\n .asSlice()\n .loadRef(),\n ] as const\n }\n\n if (field.fieldType === 'cl::t::addressList' && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n serializeAddressList(fieldValue as AddressListTypeLike),\n ] as const\n }\n\n if (isClassName(_tonObjects, field.fieldType) && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n generateEncodeClass(_tonObjects)(\n field.fieldType,\n fieldValue as Fields<\n _TonObjects,\n typeof field.fieldType,\n ClassTypeLike,\n NumberTypeLike,\n BoolTypeLike,\n AddressTypeLike,\n AddressListTypeLike,\n DictionaryTypeLike<any>\n >\n ),\n ] as const\n }\n\n const typeMetadata = field.fieldType.split('cl::t::')[1] as keyof typeof cl.t\n let tNumber: number\n if (typeMetadata in cl.t) {\n tNumber = cl.t[typeMetadata]\n } else {\n tNumber = cl.t.objRef\n }\n\n return [Number(index), tNumber, fieldValue, typeMetadata] as const\n })\n .sort(([a], [b]) => a - b)\n .map(([_, type, value, typeMetadata]) => ({\n type,\n value,\n typeMetadata,\n })) as ClDeclareField[]\n\n return clDeclare(asciiStringToBigint(_tonObjects[className].name), results)\n }\n\nexport const generateDecodeClass =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName,\n cell: Cell\n ): Fields<_TonObjects, ClassName> => {\n const { className, classDefinition } = getClassNameAndDefinition(_tonObjects)(_className)\n\n const enhanceCell = (cell: Cell): EnhancedCell<_TonObjects> => {\n return new Proxy(cell, {\n get(target, prop): any {\n if (prop === 'getAddressList') {\n // eslint-disable-next-line no-use-before-define\n return () => enhanceAddressList(cell)\n }\n\n if (prop === 'cellsToHex') {\n return () => cellsToHex(cell)\n }\n\n if (prop === 'getDict') {\n // eslint-disable-next-line no-use-before-define\n return enhancedLoadDict(cell).getDict\n }\n\n if (prop === 'decode') {\n // eslint-disable-next-line no-use-before-define\n return <ClassName extends TonObjectsKeys<_TonObjects>>(className: ClassName) =>\n generateDecodeClass(_tonObjects)(className, cell)\n }\n\n if (prop === 'clGetCellRef') {\n return (index: number) => enhanceCell(clGetCellRef(cell, index))\n }\n\n if (prop === 'clGetUint') {\n return (index: number, width: number) => clGetUint(cell, index, width)\n }\n\n if (prop === 'getCellName') {\n return () => getCellName(cell)\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedCell<_TonObjects>\n }\n\n const injectRawCell = <V extends object>(\n value: V,\n rawCell: Cell\n ): DecodedAndRaw<V, EnhancedCell<_TonObjects>> => {\n return new Proxy(value, {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }) as DecodedAndRaw<V, EnhancedCell<_TonObjects>>\n }\n\n const enhanceAddress = (address: bigint): EnhancedAddress => {\n return new Proxy(bigintToAddress(address), {\n get(target, prop): any {\n if (prop === 'toHex') {\n return () => bigIntToHex(address)\n }\n\n if (prop === 'toBigInt') {\n return () => address\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedAddress\n }\n\n const enhanceAddressList = (rawCell: Cell): DecodedAndRaw<EnhancedAddressList, EnhancedCell<_TonObjects>> => {\n const addressList = deserializeAddressList(rawCell).map(enhanceAddress)\n return injectRawCell(\n new Proxy(addressList, {\n get(target, prop): any {\n if (prop === 'toHex') {\n return () => addressList.map((address) => address.toHex())\n }\n\n if (prop === 'toBigInt') {\n return () => addressList.map((address) => address.toBigInt())\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedAddressList,\n rawCell\n )\n }\n\n const enhancedLoadDict = (rawCell: Cell): LoadableDict<_TonObjects> => {\n return {\n getDict: (value): Dictionary<bigint, any> => {\n return rawCell.bits.length === 0\n ? Dictionary.empty(Dictionary.Keys.BigUint(256), value)\n : rawCell.beginParse().loadDictDirect(Dictionary.Keys.BigUint(256), value)\n },\n rawCell: enhanceCell(rawCell),\n }\n }\n\n return Object.fromEntries(\n (\n Object.entries(classDefinition) as [\n string,\n {\n fieldName: string\n fieldType: FieldTypes<_TonObjects>\n },\n ][]\n )\n .filter(([_, field]) => typeof field !== 'string')\n .map(([index, field]) => {\n const tNumber = cl.t[field.fieldType.split('cl::t::')[1] as keyof typeof cl.t]\n\n const fieldName = field.fieldName.split(`${className}::`)[1]\n\n if (field.fieldType in _tonObjects) {\n const rawCell = clGetCellRef(cell, Number(index))\n\n if (field.fieldType === baseObjects.POOO.name && emptyCell().hash().equals(rawCell.hash())) {\n return [\n fieldName,\n new Proxy(emptyPOOO(), {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }),\n ] as const\n }\n\n return [\n fieldName,\n new Proxy(\n generateDecodeClass(_tonObjects)(field.fieldType, clGetCellRef(cell, Number(index))),\n {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }\n ),\n ]\n }\n\n if (field.fieldType === 'cl::t::addressList') {\n const rawCell = clGetCellRef(cell, Number(index))\n\n return [fieldName, enhanceAddressList(rawCell)]\n }\n\n if (field.fieldType === 'cl::t::dict256') {\n return [fieldName, enhancedLoadDict(clGetCellRef(cell, Number(index)))]\n }\n\n if (tNumber === cl.t.objRef) {\n return [fieldName, enhanceCell(clGetCellRef(cell, Number(index)))]\n }\n\n if (field.fieldType === 'cl::t::address') {\n return [fieldName, enhanceAddress(clGetUint(cell, Number(index), _getTypeWidth(tNumber)))]\n }\n\n if (field.fieldType === 'cl::t::bool') {\n return [fieldName, clGetUint(cell, Number(index), _getTypeWidth(tNumber)) === 1n]\n }\n\n return [fieldName, clGetUint(cell, Number(index), _getTypeWidth(tNumber))]\n })\n ) as Fields<_TonObjects, ClassName>\n }\n\nexport const baseEncodeClass = generateEncodeClass(baseObjects)\nexport const baseDecodeClass = generateDecodeClass(baseObjects)\n","import { BitBuilder, BitReader, Builder, Cell, Slice, beginCell } from '@ton/core'\n\nimport { AddressListTypeLike, AddressTypeLike, MAX_CELL_BITS, NAME_WIDTH, NumberTypeLike } from './class'\nimport { baseEncodeClass } from './generators'\nimport { addressToBigInt, addressToHex } from '../../../address-utils'\n\nexport const asciiStringToBigint = (target: string): bigint => {\n return BigInt(`0x${Buffer.from(target).toString('hex')}`)\n}\n\nexport const bigintToAsciiString = (target: bigint): string => {\n return Buffer.from(target.toString(16), 'hex').toString('ascii')\n}\n\nexport const getCellNameNumber = (cell: Cell): bigint => {\n const slice = cell.beginParse()\n const name = slice.loadUintBig(NAME_WIDTH)\n return name\n}\n\nexport const getCellName = (cell: Cell): string => {\n const nameNumber = getCellNameNumber(cell)\n return bigintToAsciiString(nameNumber)\n}\n\nexport const emptyCell = (): Cell => {\n return beginCell().asCell()\n}\n\nexport const nullObject = (): Cell => {\n return emptyCell()\n}\n\nexport const emptyMap = (): Cell => {\n return emptyCell()\n}\n\nexport const emptyPOOO = (): Cell => {\n return baseEncodeClass('POOO', {\n nextEmpty: 1,\n bitmap: ((): Cell => {\n const builder = new BitBuilder(MAX_CELL_BITS)\n builder.writeUint(0, 1023)\n\n const bitString = builder.build()\n const bitReader = new BitReader(bitString)\n const slice = new Slice(bitReader, [])\n\n return slice.asCell()\n })(),\n })\n}\n\nexport const initBaseStorage = (owner: AddressTypeLike): Cell => {\n return baseEncodeClass('BaseStorage', {\n owner,\n authenticated: false,\n initialized: false,\n initialStorage: emptyCell(),\n })\n}\n\nexport function serializeAddressList(addresses: AddressListTypeLike): Cell {\n if (addresses instanceof Cell) {\n return addresses\n }\n\n // Start with array of builders, initialize with first builder\n const addressListBuilder: Builder[] = [beginCell()]\n\n // Iterate through each address\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let idx = 0; idx < addresses.length; idx++) {\n // Check if current builder has enough space for next address (256 bits)\n if (addressListBuilder[addressListBuilder.length - 1].availableBits < 256) {\n // If not enough space, create new builder\n addressListBuilder.push(beginCell())\n }\n\n // Store the address in current builder\n addressListBuilder[addressListBuilder.length - 1].storeUint(addressToBigInt(addresses[idx]), 256)\n }\n\n // Build the cell chain from back to front\n let resultCell: Cell = addressListBuilder.pop()!.endCell()\n while (addressListBuilder.length > 0) {\n const head = addressListBuilder.pop()!\n resultCell = head.storeRef(resultCell).endCell()\n }\n\n return resultCell\n}\n\nexport function deserializeAddressList(cell: Cell): bigint[] {\n const addresses: bigint[] = []\n\n let currentCell: Cell | null = cell\n\n while (currentCell) {\n const slice = currentCell.beginParse()\n\n // Iterate through all the addresses in the current cell\n while (slice.remainingBits >= 256) {\n // Extract 256-bit address and add it to the addresses list\n addresses.push(slice.loadUintBig(256))\n }\n\n // Move to the next reference cell if available\n currentCell = slice.remainingRefs > 0 ? slice.loadRef() : null\n }\n\n return addresses\n}\n\nexport function serializePayees(payeesInfo: { address: AddressTypeLike; amount: NumberTypeLike }[]): Cell {\n const numPayees = payeesInfo.length\n\n if (numPayees === 0) {\n return emptyCell()\n }\n\n let linkedList = beginCell()\n let idx = 1\n\n while (idx <= numPayees) {\n const curPayee = payeesInfo[numPayees - idx]\n\n if (idx % 3 === 0) {\n linkedList = beginCell()\n .storeRef(linkedList.endCell())\n .storeUint(addressToBigInt(curPayee.address), 256)\n .storeUint(BigInt(curPayee.amount), 64)\n } else {\n linkedList = linkedList\n .storeUint(addressToBigInt(curPayee.address), 256)\n .storeUint(BigInt(curPayee.amount), 64)\n }\n\n idx += 1\n }\n\n return linkedList.endCell()\n}\n\nexport function deserializePayees(serializedPayees: Cell): { address: string; amount: bigint }[] {\n let payeesSlice = serializedPayees.beginParse()\n\n if (payeesSlice.remainingBits === 0) {\n return []\n }\n\n const payees: { address: string; amount: bigint }[] = []\n const payeeBits = 256 + 64\n\n while (payeesSlice.remainingBits >= payeeBits || payeesSlice.remainingRefs > 0) {\n if (payeesSlice.remainingBits >= payeeBits) {\n payees.push({\n address: addressToHex(payeesSlice.loadUintBig(256)),\n amount: payeesSlice.loadUintBig(64),\n })\n } else if (payeesSlice.remainingRefs > 0) {\n payeesSlice = payeesSlice.loadRef().beginParse()\n } else {\n break\n }\n }\n\n return payees\n}\n","import { Address, BitString, Cell, Dictionary, beginCell } from '@ton/core'\n\nimport { emptyCell } from './helpers'\nimport { addressToBigInt } from '../../../address-utils'\n\nexport const cl = {\n t: {\n uint1: 0,\n bool: 0, // same as uint1\n uint2: 1,\n uint4: 2,\n uint8: 3,\n uint16: 4,\n uint32: 5,\n uint64: 6,\n uint128: 7,\n coins: 7, // same as uint128\n uint256: 8,\n address: 8, // same as uint256\n cellRef: 9, // same as cellRef\n dict256: 9, // same as cellRef\n objRef: 9, // same as cellRef\n addressList: 9, // same as cellRef\n },\n NULL_CLASS_NAME: 'NULL',\n ERROR: {\n INVALID_CLASS: 'INVALID_CLASS',\n },\n} as const\n\nconst MAX_NAME_LEN = 10\nexport const NAME_WIDTH = 8 * MAX_NAME_LEN\n\nconst FIELD_TYPE_WIDTH = 4\nconst CELL_ID_WIDTH = 2\nconst DATA_OFFSET_WIDTH = 10\nconst REF_OFFSET_WIDTH = 2\nconst FIELD_INFO_WIDTH = FIELD_TYPE_WIDTH + CELL_ID_WIDTH + DATA_OFFSET_WIDTH + REF_OFFSET_WIDTH\nconst MAX_CLASS_FIELDS = 15\n\nconst BASIC_HEADER_WIDTH = NAME_WIDTH\nconst HEADER_WIDTH = BASIC_HEADER_WIDTH + MAX_CLASS_FIELDS * FIELD_INFO_WIDTH\nexport const MAX_CELL_BITS = 1023\nconst MAX_CELL_REFS = 4\n\nexport type ClassTypeLike = Cell\nexport type NumberTypeLike = string | bigint | number\nexport type BoolTypeLike = NumberTypeLike | boolean\nexport type AddressTypeLike = Address | string | bigint\nexport type AddressListTypeLike = AddressTypeLike[] | Cell\nexport type DecodedAndRaw<T, _Cell extends Cell = Cell> = T & {\n rawCell: _Cell\n}\nexport type DictionaryTypeLike<V> = Dictionary<bigint, V> | Cell | DecodedAndRaw<object>\n\nexport interface ClDeclareCellField {\n type: typeof cl.t.objRef\n value: Cell\n}\n\nexport interface ClDeclareNumericField {\n type: (typeof cl.t)[keyof Omit<typeof cl.t, 'objRef' | 'cellRef' | 'dict256'>]\n value: NumberTypeLike | BoolTypeLike | AddressTypeLike\n typeMetadata: keyof (typeof cl)['t']\n}\n\nexport type ClDeclareField = ClDeclareCellField | ClDeclareNumericField\n\n/**\n * Throws an error if value is smaller than -1\n */\nexport const numberTypeLikeToAbsBigInt = (\n val: NumberTypeLike | BoolTypeLike | AddressTypeLike,\n typeMetadata?: keyof (typeof cl)['t']\n): bigint => {\n if (val instanceof Address) {\n return addressToBigInt(val)\n }\n\n if (typeof val === 'string') {\n if (Address.isFriendly(val) || Address.isRaw(val)) {\n return addressToBigInt(Address.parse(val))\n }\n\n if (typeMetadata === 'address') {\n // Only try to convert the string as an address if the type of the field is marked as an address to avoid interpreting numbers as addresses\n try {\n // NOTE - Igor: this differs from the offchain monorepo impl\n return BigInt('0x0' + val.substring(2))\n } catch {\n // Not a known address type for other chains\n }\n }\n }\n\n const _val = BigInt(val)\n\n if (_val < -1n) {\n throw new Error('Invalid value. Only accepted negative value is -1')\n }\n\n return _val < 0 ? -_val : _val\n}\n\nexport const _getTypeWidth = (clType: (typeof cl.t)[keyof typeof cl.t]): number => {\n if (clType <= cl.t.uint256) {\n return 1 << clType\n }\n\n return 0\n}\n\nconst isNumericType = (field: ClDeclareField): field is ClDeclareNumericField => {\n // On TON classes all the fields are stored as a Cell or a uint and\n // and the types are ordered in a way that all the uints are lower than\n // the class values\n return field.type <= cl.t.uint256\n}\n\nconst isCellType = (field: ClDeclareField): field is ClDeclareCellField => {\n // For all the cells, the type is always the same number stored as cellRef\n // and all the other types that are cells map to the same number\n return field.type == cl.t.cellRef\n}\n\nexport const clDeclare = (name: bigint, fields: ClDeclareField[]): Cell => {\n if (fields.length > MAX_CLASS_FIELDS) {\n throw new Error(cl.ERROR.INVALID_CLASS)\n }\n\n const classBuilder = [null, beginCell()]\n\n let headerBuilder = beginCell().storeUint(name, NAME_WIDTH)\n\n let curDataCell = 1\n let curRefCell = 1\n let curCellMaxRefs = 2\n let curDataOffset = HEADER_WIDTH\n let curRefOffset = 0\n\n for (const field of fields) {\n const fieldBits = _getTypeWidth(field.type)\n\n if (curDataOffset + fieldBits > MAX_CELL_BITS) {\n curDataCell += 1\n curDataOffset = 0\n if (curDataCell >= classBuilder.length) {\n classBuilder.push(beginCell())\n }\n }\n if (fieldBits == 0) {\n if (curRefOffset + 1 > curCellMaxRefs) {\n curRefCell += 1\n curRefOffset = 0\n curCellMaxRefs = MAX_CELL_REFS\n if (curRefCell >= classBuilder.length) {\n classBuilder.push(beginCell())\n }\n }\n }\n\n if (isNumericType(field)) {\n classBuilder[curDataCell] = classBuilder[curDataCell]!.storeUint(\n numberTypeLikeToAbsBigInt(field.value, field.typeMetadata),\n fieldBits\n )\n } else if (isCellType(field)) {\n classBuilder[curRefCell] = classBuilder[curRefCell]!.storeRef(field.value)\n } else {\n throw new Error(cl.ERROR.INVALID_CLASS)\n }\n\n headerBuilder = headerBuilder.storeUint(field.type, FIELD_TYPE_WIDTH)\n if (fieldBits > 0) {\n headerBuilder = headerBuilder\n .storeUint(curDataCell == 1 ? 0 : curDataCell, CELL_ID_WIDTH)\n .storeUint(curDataOffset, DATA_OFFSET_WIDTH)\n .storeUint(3, REF_OFFSET_WIDTH)\n curDataOffset += fieldBits\n } else {\n headerBuilder = headerBuilder\n .storeUint(curRefCell == 1 ? 0 : curRefCell, CELL_ID_WIDTH)\n .storeUint(MAX_CELL_BITS, DATA_OFFSET_WIDTH)\n .storeUint(curRefOffset, REF_OFFSET_WIDTH)\n curRefOffset += 1\n }\n }\n\n let rootBuilder = classBuilder[1]!\n const numCells = classBuilder.length - 1\n\n if (numCells > 1) {\n if (rootBuilder.refs == 0) {\n rootBuilder = rootBuilder.storeRef(emptyCell()).storeRef(emptyCell())\n } else if (rootBuilder.refs == 1) {\n rootBuilder = rootBuilder.storeRef(emptyCell())\n }\n }\n\n const trailingOnes = HEADER_WIDTH - headerBuilder.bits\n\n headerBuilder = headerBuilder\n .storeBits(new BitString(Buffer.from('F'.repeat(trailingOnes), 'hex'), 0, trailingOnes))\n .storeBuilder(rootBuilder)\n\n if (numCells == 1) {\n return headerBuilder.endCell()\n }\n\n if (numCells == 2) {\n return headerBuilder.storeRef(classBuilder[2]!.endCell()).endCell()\n }\n\n return headerBuilder.storeRef(classBuilder[2]!.endCell()).storeRef(classBuilder[3]!.endCell()).endCell()\n}\n\nconst loadFieldInfo = (\n cell: Cell,\n fieldName: number\n): { fieldCellIndex: number; fieldOffset: number; fieldRefIdx: number } => {\n const headerSlice = cell.beginParse()\n const fieldInfoOffset = BASIC_HEADER_WIDTH + fieldName * FIELD_INFO_WIDTH\n headerSlice.skip(fieldInfoOffset + FIELD_TYPE_WIDTH)\n const fieldCellIndex = headerSlice.loadUint(CELL_ID_WIDTH)\n const fieldOffset = headerSlice.loadUint(DATA_OFFSET_WIDTH)\n const fieldRefIdx = headerSlice.loadUint(REF_OFFSET_WIDTH)\n return { fieldCellIndex, fieldOffset, fieldRefIdx }\n}\n\nexport const clGetUint = (cell: Cell, fieldName: number, width: number): bigint => {\n const headerSlice = cell.beginParse()\n const { fieldCellIndex, fieldOffset } = loadFieldInfo(cell, fieldName)\n\n if (fieldCellIndex == 0) {\n return headerSlice.skip(fieldOffset).loadUintBig(width)\n }\n\n for (let i = 0; i < fieldCellIndex; i++) {\n headerSlice.loadRef()\n }\n\n return headerSlice.loadRef().beginParse().skip(fieldOffset).loadUintBig(width)\n}\n\nexport const clGetCellRef = (cell: Cell, fieldName: number): Cell => {\n const headerSlice = cell.beginParse()\n const { fieldCellIndex, fieldRefIdx } = loadFieldInfo(cell, fieldName)\n\n if (fieldCellIndex == 0) {\n for (let i = 0; i < fieldRefIdx; i++) {\n headerSlice.loadRef()\n }\n\n return headerSlice.loadRef()\n }\n\n for (let i = 0; i < fieldCellIndex; i++) {\n headerSlice.loadRef()\n }\n\n const cellRef = headerSlice.loadRef().beginParse()\n\n for (let i = 0; i < fieldRefIdx; i++) {\n cellRef.loadRef()\n }\n\n return cellRef.loadRef()\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-return */\n\nimport { Address, Cell } from '@ton/core'\n\nimport { getCellName } from './class'\nimport { addressToHex } from '../../address-utils'\n\ntype Primitive = string | number | bigint | any[] | boolean | object\n\n/**\n * Recursively traverses a TON cell, deciding how to decode each node based on\n * the class names stored in the cell.\n * @param cell the root cell to begin decoding from.\n * @param hashUndecodeable if TRUE, cells that can't be decoded will be hashed. if FALSE, they will be returned unchanged.\n * This does not apply to primitive values.\n * @returns an object whose fields are each the fields of the decoded cell, and whose (cell) fields are themselves decoded.\n */\nexport const deepDecode = <\n Recurse extends { [key: string]: Recurse },\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cell: Cell | Primitive,\n hashUndecodeable?: boolean\n): any => {\n if (!(cell instanceof Cell)) {\n //\"cell\" is a primitive, or otherwise can't be decoded as it is not a TON cell\n return cell\n }\n\n try {\n const decoded = decodeClass(getCellName(cell) as ClassName, cell)\n return Object.fromEntries(\n //cell was decoded successfully, recurse\n Object.entries(decoded).map(([k, v]) => [\n k,\n deepDecode<Recurse, ClassName, DecodeClass>(decodeClass, v, hashUndecodeable),\n ])\n )\n } catch (e) {\n //could not decode cell, probably because it has no class name. either hash it, or return it\n return hashUndecodeable === true ? cell.hash().toString('hex') : cell\n }\n}\n\nexport const printDeepDecode = <\n Recurse extends { [key: string]: Recurse },\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cell: Cell | Primitive\n): void => {\n console.log(\n JSON.stringify(\n deepDecode<Recurse, ClassName, DecodeClass>(decodeClass, cell, true),\n (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString()\n }\n\n if (v instanceof Address) {\n return addressToHex(v)\n }\n\n return v\n },\n 2\n )\n )\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return */\n\nimport { Cell } from '@ton/core'\n\nimport { deepDecode } from './deepDecodeCell'\n\nconst diffRecurse = (\n cellA: { [key: string]: any },\n cellB: { [key: string]: any },\n ancestry: string[]\n): { a: any; b: any; ancestry: string[] }[] => {\n if (cellA === cellB) {\n return []\n }\n if (typeof cellA !== 'object' || typeof cellB !== 'object') {\n return [{ a: cellA, b: cellB, ancestry }]\n }\n const cellAKeysSet = new Set(Object.keys(cellA))\n return [\n ...Object.keys(cellA).map((cellAKey) =>\n diffRecurse(cellA[cellAKey], cellB[cellAKey], ancestry.concat(cellAKey))\n ),\n ...Object.keys(cellB)\n .filter((k) => !cellAKeysSet.has(k))\n .map((cellBKey) => {\n return diffRecurse(cellA[cellBKey], cellB[cellBKey], ancestry.concat(cellBKey))\n }),\n ].flat()\n}\n\n/**\n * Deeply compare two TON cells.\n * @param cellA\n * @param cellB\n * @returns an object with a list of all values that differ between the two cells. Each inequal value is {a, b, ancestry},\n * where a and b are the values of cellA and cellB respectively, and ancestry is an array [p_0 ... p_n] s.t. p_i is the name\n * of the field accessed at both cellA and cellB _i_ deep.\n * This function returns _every_ difference between the two cells, except in the case where,\n * e.g., cellA = {subObject: 'hello world'}, cellB = {sub: {a, b, c: {x, y, z}}}--inequalValues = {a: 'hello world', b: [Object object], ancestry: ['Cell', 'subObject'].\n * I.e., it is unable to detect sub-failures after ancestry diverges.\n */\nexport const deepDiff = <\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cellA: Cell,\n cellB: Cell\n): {\n isEqual: boolean\n inequalValues: { a: any; b: any; ancestry: string[] }[]\n} => {\n const decodedA = deepDecode<{ [key: string]: any }, ClassName, DecodeClass>(decodeClass, cellA, true)\n const decodedB = deepDecode<{ [key: string]: any }, ClassName, DecodeClass>(decodeClass, cellB, true)\n const recursed = diffRecurse(decodedA, decodedB, ['diff_root'])\n return { isEqual: recursed.length === 0, inequalValues: recursed }\n}\n\nexport const printDeepDiff = <\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cellA: Cell,\n cellB: Cell\n): void => {\n console.log(\n JSON.stringify(\n deepDiff<ClassName, DecodeClass>(decodeClass, cellA, cellB),\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\n 2\n )\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/address-utils.ts","../src/utils.ts","../src/sdk-tools.ts","../src/base-wrapper.ts","../src/ClasslibWrapper.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","../src/send-tx.ts","../src/all-storages.ts","../src/common-ton/src/wallet.ts","../src/common-ton/src/cells.ts","../src/common-ton/src/class/generators.ts","../src/common-ton/src/class/helpers.ts","../src/common-ton/src/class/class.ts","../src/common-ton/src/deepDecodeCell.ts","../src/common-ton/src/deepDiffCells.ts","../src/lz-dict.ts"],"names":["toBigIntBE","toBufferBE","str","Address","beginCell","Dictionary","ethers","storeMessageRelaxed","Cell","loadMessageRelaxed","crc32","fs","path","name","SendMode","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3","mnemonicToHDSeed","deriveEd25519Path","keyPairFromSeed","WalletContractV4","mnemonicToWalletKey","BitString","BitBuilder","field","asciiStringToBigint","cell","className","BitReader","Slice"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,oCAAA,EA8tCK,QAAQ,eAAe,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,CAAA;AA4DzD,EAAAO,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,SAAmB,EAAA,QAAA,EAAkB,YAA6C,EAAA;AACnH,EAAM,MAAA,OAAA,GAAU,iBAAiB,YAAY,CAAA;AAE7C,EAAA,MAAM,SAAY,GAAA,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6DAAA,EAmByC,QAAQ,eAAe,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,CAAA;AAoVlF,EAAAD,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,SAAmB,EAAA,QAAA,EAAkB,YAA6C,EAAA;AACnH,EAAM,MAAA,OAAA,GAAU,iBAAiB,YAAY,CAAA;AAE7C,EAAA,MAAM,SAAY,GAAA,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,QAAA,EA0CZ,QAAQ,eAAe,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;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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 } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\n\nimport { AddressTypeLike } from './common-ton/src/class/class'\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\nexport function 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 bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const parseTonAddress = (address: AddressTypeLike): Address => {\n if (address instanceof Address) {\n return address\n }\n\n if (typeof address === 'bigint' || typeof address === 'number') {\n return bigintToAddress(BigInt(address))\n }\n\n if (address.startsWith('0x')) {\n // If it's a hex address format it to ton format\n return bigintToAddress(BigInt(address))\n }\n\n try {\n return Address.parse(address)\n } catch (e) {\n // handles the case where the address is hex format without leading 0x\n return bigintToAddress(BigInt(`0x${address}`))\n }\n}\n\nconst _addressToNotPaddedHex = (address: AddressTypeLike): string => {\n return `0x${parseTonAddress(address).hash.toString('hex')}`\n}\n\nexport const bigIntToHex = (bigInt: bigint): string => {\n return `0x${bigInt.toString(16)}`.toLowerCase()\n}\n\nexport const addressToHex = (address: AddressTypeLike): string => {\n return `0x${to32ByteBuffer(_addressToNotPaddedHex(address)).toString('hex')}`.toLowerCase()\n}\n\nexport const addressToBigInt = (address: AddressTypeLike): bigint => {\n return BigInt(_addressToNotPaddedHex(address))\n}\n\nexport const compareAddresses = (addressA: AddressTypeLike, addressB: AddressTypeLike): boolean => {\n return parseTonAddress(addressA).equals(parseTonAddress(addressB))\n}\n","import { Cell, Dictionary, MessageRelaxed, beginCell, loadMessageRelaxed, storeMessageRelaxed } from '@ton/core'\nimport { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox'\nimport * as crc32 from 'crc-32'\nimport { ethers } from 'ethers'\n\nimport { addressToBigInt } from './address-utils'\nimport { BaseWrapper } from './base-wrapper'\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\nexport const PUBLIC_KEY_BYTE_LENGTH = 64\nexport const SIGNATURE_BYTE_LENGTH = 65\nexport const SEED_SIZE = 32\n\nexport function publicKeyToHash(publicKey: Uint8Array): bigint {\n const publicKeyCell = beginCell().storeBuffer(Buffer.from(publicKey), PUBLIC_KEY_BYTE_LENGTH).endCell()\n const publicKeyHash = BigInt('0x' + publicKeyCell.hash().toString('hex'))\n return publicKeyHash\n}\n\nexport function preprocessPublicKey(publicKey: string): Buffer {\n // Remove '0x' prefix and convert to Buffer\n const publicKeyBuffer = Buffer.from(publicKey.slice(2), 'hex')\n // skip the first byte (h) as it's always 4\n return publicKeyBuffer.subarray(1)\n}\n\nexport function stringPublicKeyToHash(publicKey: string): bigint {\n return publicKeyToHash(preprocessPublicKey(publicKey))\n}\n\nexport function createVerifierDictSet(verifiers: Uint8Array[]): Cell {\n const verifierDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n for (const verifier of verifiers) {\n verifierDict.set(publicKeyToHash(verifier), beginCell().endCell())\n }\n return beginCell().storeDictDirect(verifierDict, Dictionary.Keys.BigUint(256), Dictionary.Values.Cell()).endCell()\n}\n\nexport function createVerifierDictSetFromStrings(publicKeys: string[]): Cell {\n // Convert string public keys to Uint8Array format\n const publicKeyBuffers = publicKeys.map((key) => preprocessPublicKey(key))\n // Call the first function with the converted keys\n return createVerifierDictSet(publicKeyBuffers)\n}\n\nexport function createVerifierDictSetFromEtherWallets(verifiers: ethers.Wallet[]): Cell {\n const publicKeys = verifiers.map((key) => key.publicKey)\n return createVerifierDictSetFromStrings(publicKeys)\n}\n\nexport function createAdminDictSet(admins: SandboxContract<TreasuryContract | BaseWrapper>[]): Cell {\n const verifierDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n for (const admin of admins) {\n verifierDict.set(addressToBigInt(admin.address), beginCell().endCell())\n }\n return beginCell().storeDictDirect(verifierDict, Dictionary.Keys.BigUint(256), Dictionary.Values.Cell()).endCell()\n}\n\nexport function createSignatures(hash: Buffer, verifiers: ethers.Wallet[]): Cell {\n const signatures = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n for (const verifier of verifiers) {\n // doing this one insted of .signMessage() to not sign with the \"Ethereum\" prefix\n const signature = verifier._signingKey().signDigest(hash)\n const signatureBytes = ethers.utils.splitSignature(signature)\n const signatureBytesArray = new Uint8Array([\n ...ethers.utils.arrayify(signatureBytes.r),\n ...ethers.utils.arrayify(signatureBytes.s),\n signatureBytes.v,\n ])\n\n signatures.set(\n stringPublicKeyToHash(verifier.publicKey),\n beginCell().storeBuffer(Buffer.from(signatureBytesArray), SIGNATURE_BYTE_LENGTH).endCell()\n )\n\n // Sanity Check: Attempt to recover the public key from the signature\n // const messageHash = ethers.utils.arrayify(hash)\n // try {\n // const recoveredPublicKey = ethers.utils.recoverPublicKey(messageHash, signatureBytes)\n // const originalPublicKey = verifier.publicKey\n\n // console.log(`Verifier:`)\n // console.log(`Original public key: ${originalPublicKey}`)\n // console.log(`Recovered public key: ${recoveredPublicKey}`)\n\n // if (recoveredPublicKey.toLowerCase() === originalPublicKey.toLowerCase()) {\n // console.log('Public key successfully recovered!')\n // } else {\n // console.log('Public key recovery failed.')\n // }\n // } catch (error) {\n // console.error(`Error recovering public key for verifier:`, error)\n // }\n }\n return beginCell().storeDictDirect(signatures, Dictionary.Keys.BigUint(256), Dictionary.Values.Cell()).endCell()\n}\n\nexport function generateRandomVerifierSet(count: number): ethers.Wallet[] {\n const verifiers: ethers.Wallet[] = []\n for (let i = 0; i < count; i++) {\n const privateKey = ethers.utils.randomBytes(SEED_SIZE)\n verifiers.push(new ethers.Wallet(privateKey))\n }\n return verifiers\n}\n\nexport const getBocStringFromMessage = (message: MessageRelaxed): string => {\n return beginCell().store(storeMessageRelaxed(message)).endCell().toBoc().toString('base64')\n}\n\nexport const getMessageFromBocString = (bocString: string): MessageRelaxed => {\n const cell = Cell.fromBase64(bocString)\n const cellSlice = cell.beginParse()\n return loadMessageRelaxed(cellSlice)\n}\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 interface BlueprintArtfiact {\n hex: string\n hash?: string\n hashBase64?: string\n}\n\nexport const cellFromArtifact = ({ hex }: BlueprintArtfiact): Cell => 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 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\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","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 case 'addressList':\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 case 'addressList':\n case 'address_list':\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+::([A-Za-z0-9]+)\\s*=\\s*(\\d+);/gm\n let match\n\n let nextIndex = 0\n while ((match = regex.exec(strInput)) !== null) {\n const [, fieldName, fieldIndexStr] = match\n const fieldIndex = parseInt(fieldIndexStr, 10)\n if (fieldIndex !== nextIndex) {\n continue\n }\n fieldMap[fieldIndex] = fieldName\n inverseFieldMap[fieldName] = fieldIndex\n nextIndex++\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 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 saveBaseEventHandler(\n directory: string,\n opcodesImportPath = '../constants',\n allTypesImportPath = './allTypes',\n tonObjectUnwrapperImportPath = './TonObjectUnwrapper',\n tonContractWrapperImportPath = './TonContractWrapper',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const allTypes = ['ActionEvent', 'Md', 'nameMap'].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'\nimport { ExtendedContract, getLzDict } from '${baseWrapperImportPath}'\n\nimport { OPCODES } from '${opcodesImportPath}'\n\nimport {\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\n\nimport { TonObjectUnwrapper } from '${tonObjectUnwrapperImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\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 = TonContractWrapper.bigintToAsciiString(this._event.topic)\n this.bodyName = await wrapper.getTypeOf(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 BaseEventHandler {\n public allFailures = {\n txList: [] as BlockchainTransaction[],\n events: [] as EventMessageSent[],\n }\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n }\n\n async postProcessSuccess(event: LzEvent, tx: BlockchainTransaction & Transaction): Promise<void> {\n // base case: do nothing\n }\n\n async postProcessFailure(event: EventMessageSent, tx: BlockchainTransaction & Transaction): Promise<void> {\n // base case: do nothing\n }\n\n async addCurrentEventsToAllEvents(\n results: SendMessageResult,\n contract: ExtendedContract<TonContractWrapper>\n ): 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 await this.postProcessSuccess(newLzEvent, tx)\n }\n } else {\n const failureEvent = results.events[i] as EventMessageSent\n this.allFailures.txList.push(tx)\n this.allFailures.events.push(failureEvent)\n await this.postProcessFailure(failureEvent, tx)\n }\n }\n }\n}\n`\n fs.writeFileSync(path.join(directory, 'BaseEventHandler.ts'), savedCode)\n}\n\nexport function saveLzEventHandler(\n directory: string,\n allTypesImportPath = './allTypes',\n baseEventHandlerImportPath = './BaseEventHandler'\n): void {\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 } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\n\nimport { Md, MdPacketSent } from '${allTypesImportPath}'\nimport { BaseEventHandler, LzEvent } from '${baseEventHandlerImportPath}'\n\nexport class LzEventHandler extends BaseEventHandler {\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n packetsSent: [] as MdPacketSent[],\n }\n\n async postProcessSuccess(event: LzEvent, tx: BlockchainTransaction & Transaction): Promise<void> {\n if (event.topic === 'Channel::event::PACKET_SENT' && this.isMdPacketSent(event.body)) {\n this.allVictories.packetsSent.push(event.body)\n }\n await Promise.resolve()\n }\n\n isMdPacketSent(md: Md): md is MdPacketSent {\n return (\n 'nativeFee' in md &&\n 'zroFee' in md &&\n 'extraOptions' in md &&\n 'enforcedOptions' in md &&\n 'packetEncoded' in md &&\n 'nonce' in md\n )\n }\n}\n`\n fs.writeFileSync(path.join(directory, 'LzEventHandler.ts'), savedCode)\n}\n\nexport function saveTonContractWrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n classlibWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const generatedMethods = Object.entries(tonObjects)\n .map(([_, tonObject]) => tonObject.constructorCode ?? '')\n .join('\\n')\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 beginCell,\n} from '@ton/core'\n\nimport { ClasslibWrapper } from '${classlibWrapperImportPath}'\n\nexport class TonContractWrapper extends ClasslibWrapper {\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 ${generatedMethods}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonContractWrapper.ts'), savedCode)\n}\n\nexport function saveAllTypes(\n tonObjects: TonObjectsDict,\n directory: string,\n tonContractWrapperImportPath = './TonContractWrapper',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): 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 const keyMapping: { [key: string]: string } = {}\n Object.entries(tonObjects).forEach(([key, 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 keyMapping[item.tonName] = key\n })\n const generatedNameMaps = `\n export const nameMap: { [key: string]: string } = {\n ${Object.entries(mapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val[0] + \"',\")\n .join('\\n')}\n }\n \n export const keyMap: { [key: string]: string } = {\n ${Object.entries(keyMapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val + \"',\")\n .join('\\n')}\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 '${tonContractWrapperImportPath}'\nimport { ExtendedContract, LzDict, getLzDict } from '${baseWrapperImportPath}'\n\nexport interface Md {}\n\n${generatedTypes}\n\n${generatedNameMaps}\n`\n\n fs.writeFileSync(path.join(directory, 'allTypes.ts'), savedCode)\n}\n\nexport function saveLzGasTracker(directory: string, opcodesImportPath = '../constants'): void {\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 '${opcodesImportPath}'\n\nexport interface 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 fs.writeFileSync(path.join(directory, 'LzGasTracker.ts'), savedCode)\n}\n\nexport function saveTonObjectUnwrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n allTypesImportPath = './allTypes',\n tonContractWrapperImportPath = './TonContractWrapper',\n classlibWrapperImportPath = '@layerzerolabs/ton-sdk-tools',\n baseWrapperImportPath = '@layerzerolabs/ton-sdk-tools'\n): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\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 {\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\nimport { ClasslibWrapper } from '${classlibWrapperImportPath}'\nimport { ExtendedContract, LzDict, getLzDict } from '${baseWrapperImportPath}'\n\nexport class TonObjectUnwrapper {\n${Array.from(\n new Map(\n Object.entries(tonObjects)\n .filter(([_, constructor]) => constructor.deconstructorCode)\n .map(([_, constructor]) => [constructor.tonName, constructor.deconstructorCode])\n ).values()\n).join('\\n')}\n}\n\n/* eslint-disable @typescript-eslint/unbound-method */\nexport const deconstructorMap = {\n ${Array.from(\n new Map(\n Object.entries(tonObjects)\n .filter(\n ([_, constructor]) =>\n constructor.deconstructorName != null &&\n constructor.deconstructorName !== '' &&\n constructor.deconstructorCode != null &&\n constructor.deconstructorCode !== ''\n )\n .map(([_, constructor]) => [constructor.tonName, constructor.deconstructorName])\n )\n )\n .map(([tonName, deconstructorName]) => `${tonName}: TonObjectUnwrapper.${deconstructorName},`)\n .join('\\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 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 extractOpcodes(fileNames: string[]): Map<string, bigint> {\n const firstFormat = /const int\\s+([\\w:]+::(?:OP|op)::\\w+)\\s*=\\s*\"([\\w:]+::(?:OP|op)::\\w+)\"c;/\n const secondFormat = /const\\s+(?:int\\s+)?([\\w:]+::[a-zA-Z]+::(?:op|OP)::\\w+)\\s*=\\s*(0x[\\da-fA-F]+);/\n const thirdFormat = /const\\s+(int\\s+)?(op::(\\w+))\\s*=\\s*(0x[0-9a-fA-F]+);/\n const fourthFormat = /^\\s*int\\s+(op::(\\w+))\\(\\)\\s+asm\\s+\"((?:0x)?[0-9a-fA-F]+)\\s+([A-Z]+)\"\\s*;$/\n const fifthFormat = /^\\s*const\\s+int\\s+(OP::[A-Z][a-zA-Z]+)\\s*=\\s*\"(OP::[A-Z][a-zA-Z]+)\"c\\s*;$/\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 ;[, 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 (rawVariableName !== '' && rawValue !== '') {\n result.set(tonConstNameToTSName(rawVariableName), value)\n }\n }\n }\n return result\n}\n\nexport function extractErrors(fileNames: string[]): Map<string, bigint> {\n const 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 const secondFormat = /^const\\s+(?:int\\s+)?(error::\\w+)\\s*=\\s*((?:0x[\\da-fA-F]+|\\d+));$/\n const thirdFormat = /^const\\s+int\\s+([\\w:]+::(?:ERROR|error)::\\w+)\\s*=\\s*(\\d+);$/i\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 if (firstFormatMatch) {\n ;[, rawVariableName, rawValue] = firstFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue) & ERRORCODE_MASK\n } else if (secondFormatMatch) {\n ;[, rawVariableName, rawValue] = secondFormatMatch as [string, string, string]\n value = BigInt(rawValue) & ERRORCODE_MASK\n } else if (thirdFormatMatch) {\n ;[, rawVariableName, rawValue] = thirdFormatMatch as [string, string, string]\n value = BigInt(rawValue) & ERRORCODE_MASK\n }\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 // Original regex for complex event patterns\n const firstFormat = /^const\\s+(?:int\\s+)?([\\w:]+::[eE][vV][eE][nN][tT]::[\\w:]+)\\s*=\\s*\"([\\w:]+)\"[uc];$/\n // New regex for EVENT/event pattern - case insensitive and allows any string content\n const secondFormat = /^const\\s+int\\s+([eE][vV][eE][nN][tT]::\\w+)\\s*=\\s*\"([^\"]+)\"u;$/\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\n // Try both regex patterns\n const eventFormatMatch = trimmedLine.match(firstFormat) ?? trimmedLine.match(secondFormat)\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 for (const dir of contractDirs) {\n const files = fs.readdirSync(dir).filter((file) => file.endsWith('.fc') || file.endsWith('.func'))\n\n for (const file of files) {\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*\\{/gm\n let match\n\n while ((match = functionRegex.exec(content)) !== null) {\n const [, returnType, name, argsString] = 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 functionArgs = [\n 'contract: ExtendedContract<TonContractWrapper>',\n ...Object.entries(tsArgs).map(function ([argName, argType]) {\n return `${argName}: ${argType}`\n }),\n ]\n\n const fnName = snakeToCamelCase('get_' + name)\n\n const code = [\n `static async ${fnName}(`,\n indent(functionArgs.join(',\\n')),\n `): Promise<[${tsReturnTypes.join(', ')}]> {`,\n ]\n\n const hasArgs = Object.keys(tonArgs).length > 0\n if (hasArgs) {\n code.push(indent(`const args: TupleItem[] = [`))\n\n const innerArgs = Object.entries(tonArgs).map(function ([argName, argType]) {\n return `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(argName, argType)} }`\n })\n\n code.push(indent(innerArgs.join(',\\n'), 2))\n\n code.push(indent(`]`))\n }\n\n code.push(indent(`const stack = await contract.getViewFunction('${name}', ${hasArgs ? 'args' : '[]'})`))\n\n const returnCalls = tonReturnTypes.map(function (_, index) {\n return `stack.${tonTypeToReadTupleFunction(tonReturnTypes[index])}`\n })\n\n code.push(indent(`return [ ${returnCalls.join(', ')} ]`))\n\n code.push('}')\n\n viewFunctions[contractName].push({\n name: fnName,\n args: tonArgs,\n returnType: tonReturnTypes,\n code: code.join('\\n'),\n })\n }\n }\n }\n return viewFunctions\n}\n\nfunction indent(input: string, count = 1): string {\n return input\n .split('\\n')\n .map(function (line) {\n return `${'\\t'.repeat(count)}${line}`\n })\n .join('\\n')\n}\n\nexport function saveViewFunctions(viewFunctions: TonViewFunctionsDict, directory: string, filename: string): void {\n const generated = [\n file_signature_header,\n `import { Address, Cell, Tuple, TupleItem, beginCell } from '@ton/core'`,\n `import { TonContractWrapper } from '../wrappers'`,\n `import { ExtendedContract } from '@layerzerolabs/ton-sdk-tools'`,\n '',\n ]\n\n for (const [contractName, functions] of Object.entries(viewFunctions)) {\n generated.push(`export class ${contractName} {`)\n generated.push(functions.map((fn) => indent(fn.code)).join('\\n\\n'))\n generated.push(`}`)\n generated.push('')\n }\n\n fs.writeFileSync(path.join(directory, filename), generated.join('\\n'))\n}\n","import {\n Address,\n Builder,\n Cell,\n Contract,\n ContractProvider,\n OpenedContract,\n SendMode,\n Sender,\n SenderArguments,\n beginCell,\n} from '@ton/core'\nimport { SandboxContract } from '@ton/sandbox'\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\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n","////// Generated by sdk/sdk-generator.ts\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n beginCell,\n contractAddress,\n} from '@ton/core'\n\nimport { BaseWrapper, SendRequestOptions } from './base-wrapper'\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 ClasslibWrapper extends BaseWrapper {\n static create(code: Cell, data: Cell, workchain = 0): ClasslibWrapper {\n const init = { code, data }\n return new ClasslibWrapper(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 sendTonPayment(provider: ContractProvider, via: Sender, opts: SendRequestOptions): Promise<void> {\n if (via.address === undefined) {\n throw new Error('Sender address is not defined')\n }\n const request = this.buildSenderArguments(beginCell().endCell(), opts)\n return this.sendRequest(provider, via, request)\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 getContractBalanceView(provider: ContractProvider, futureSeconds: bigint): Promise<bigint> {\n const getResult = await provider.get('getContractBalanceView', [{ type: 'int', value: futureSeconds }])\n return getResult.stack.readBigNumber()\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 getTypeOf(provider: ContractProvider, cell: Cell): Promise<string> {\n const ret = await provider.get('cl::typeof', [{ type: 'cell', cell: cell }])\n return ClasslibWrapper.bigintToAsciiString(ret.stack.readBigNumber())\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 static 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}\n","import fs from 'fs'\nimport path from 'path'\n\ninterface SharedGeneratorOptions {\n relativeSrcPath?: string\n}\n\nfunction getSharedOptions(input?: SharedGeneratorOptions): Required<SharedGeneratorOptions> {\n const ret: Required<SharedGeneratorOptions> = {\n relativeSrcPath: '../../src',\n ...input,\n }\n\n if (ret.relativeSrcPath.endsWith('/')) {\n throw new Error('relativeSrcPath should not end with a /')\n }\n\n return ret\n}\n\nexport function generateCommonTestUtils(\n directory: string,\n filename: string,\n optionsInput?: SharedGeneratorOptions\n): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import fs from 'fs'\n\nimport {\n Address,\n Builder,\n Cell,\n Dictionary,\n SendMode,\n TupleItem,\n TupleItemCell,\n TupleItemInt,\n beginCell,\n toNano,\n} 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'\nimport { ethers } from 'ethers'\n\nimport AllStoragesArtifact from '@layerzerolabs/layerzero-v2-ton/build/AllStorages.compiled.json'\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 ZroMinterArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroMinter.compiled.json'\nimport ZroWalletArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroWallet.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 {\n JettonMinter,\n JettonWallet,\n MultiSigOpCodes,\n Multisig,\n Order,\n Profile,\n TransferRequest,\n addressToBigInt,\n buildOnchainMetadata,\n cellFromArtifact,\n getRandomInt,\n printTransactionTrace,\n ExtendedContract,\n sendMessageViaMultisigAndExpect,\n sendInternalMessageAndExpect,\n LzDict,\n toHaveTransactions,\n addLibToBlockchain\n} from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n deconstructorMap,\n keyMap,\n} from '${options.relativeSrcPath}'\n\nexport const ActionTypes: { [key: string]: bigint } = {\n increment: BigInt(1),\n aba: BigInt(2),\n}\n\nexport interface PacketInFlight {\n fromEid: bigint\n toEid: bigint\n mdPacketSent: MdPacketSent\n}\n\nexport interface SendOptions {\n dstEid: bigint\n actionType: bigint\n extraOptions: Cell\n nativeFee: bigint\n zroFee: bigint\n}\n\nexport const invertedOpcodes = Object.fromEntries(\n Object.entries(OPCODES).map(([key, value]) => [value.toString(), key])\n)\n\nexport const newTonObjectsContainer: { items: { [key: string]: unknown } } = {\n items: {},\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\nexport function serializeAddressList(admins: SandboxContract<TreasuryContract | TonContractWrapper>[]): Cell {\n const addressList = admins.map((admin) => addressToBigInt(admin.address))\n\n // Start with array of builders, initialize with first builder\n const addressListBuilder: Builder[] = [beginCell()]\n\n // Iterate through each address\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let idx = 0; idx < addressList.length; idx++) {\n // Check if current builder has enough space for next address (256 bits)\n if (addressListBuilder[addressListBuilder.length - 1].availableBits < 256) {\n // If not enough space, create new builder\n addressListBuilder.push(beginCell())\n }\n\n // Store the address in current builder\n addressListBuilder[addressListBuilder.length - 1].storeUint(addressList[idx], 256)\n }\n\n // Build the cell chain from back to front\n let resultCell: Cell = addressListBuilder.pop()!.endCell()\n while (addressListBuilder.length > 0) {\n const head = addressListBuilder.pop()!\n resultCell = head.storeRef(resultCell).endCell()\n }\n\n return resultCell\n}\n\n// ===============================INTERFACES===============================\n\nexport interface LogData {\n [key: string]: string | bigint\n}\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface LzReceiveExpectArgs {\n lzReceivePrepareMd: Cell\n oAppFixture: OAppFixture\n deployer: SandboxContract<TreasuryContract>\n eventHandler: LzEventHandler\n msglib?: SandboxContract<TonContractWrapper>\n msglibConnection?: SandboxContract<TonContractWrapper>\n expectedLastEvent?: string\n msglibSendOpcode?: bigint\n profile?: Profile\n extraTransactions?: FlatTransactionComparable[]\n gasValue?: bigint\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 msglib: Map<bigint, SandboxContract<TonContractWrapper>>\n msglibManager: 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 msglibConnection: SandboxContract<TonContractWrapper>\n msglibConnectionCustom?: SandboxContract<TonContractWrapper>\n}\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): void {\n const formatAddress = (address: Address | string): string => {\n return address.toString()\n }\n\n const collectAddresses: (\n prefix: string,\n protocolHeader: string,\n oappHeader: string,\n fixture: OAppFixture,\n eid: bigint\n ) => {\n [p: string]: string | bigint | null\n } = function (prefix: string, protocolHeader: string, oappHeader: string, fixture: OAppFixture, eid: bigint) {\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}.msglibManager.address\\`]: formatAddress(fixture.msglibManager.address),\n [\\`\\${prefix}.msglib.address\\`]: formatAddress(fixture.msglib.get(eid)?.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}.msglibConnection.address\\`]: formatAddress(fixture.msglibConnection.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(\n 'srcFixture',\n 'Source Protocol Addresses',\n 'Source OApp Addresses',\n srcFixture,\n dstFixture?.eid ?? 0n\n ),\n ...(dstFixture\n ? collectAddresses(\n 'dstFixture',\n 'Destination Protocol Addresses',\n 'Destination OApp Addresses',\n dstFixture,\n srcFixture.eid\n )\n : {}),\n }\n\n // Format addresses in additionalLogData\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 requireDefined<T>(value: T | undefined): asserts value is T {\n if (value === undefined) {\n throw new Error('Value is undefined')\n }\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('decodeAndOverrideNonce<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function createLzPacketFromPacketEncodedOverrideNonceAndGuid(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('decodeAndOverrideNonceAndGuid<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function overrideNonceAndGuid(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('decodeAndOverrideNonceAndGuidSerialized<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\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): unknown {\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 lzReceiveAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n expectedLastEvent,\n profile,\n extraTransactions = [],\n gasValue = OAppFlowGas['Channel.LZ_RECEIVE_PREPARE'],\n}: LzReceiveExpectArgs): Promise<MdPacketSent> {\n const { oApp, channel, controller } = oAppFixture\n\n const expectedTransactions: FlatTransactionComparable[] = [\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, could come fromm either channel or OApp\n {\n to: deployer.address,\n success: true,\n },\n ]\n expectedTransactions.push(...extraTransactions)\n\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: gasValue,\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: lzReceivePrepareMd,\n expectedTransactions,\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n if (expectedLastEvent !== undefined) {\n // expect last event to be packet delivered\n expect(eventHandler.allVictories.eventObjects[eventHandler.allVictories.eventObjects.length - 1].topic).toBe(\n expectedLastEvent\n )\n }\n\n return eventHandler.allVictories.packetsSent[eventHandler.allVictories.packetsSent.length - 1]\n}\n\nexport async function lzReceiveAbaAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n msglib,\n msglibConnection,\n expectedLastEvent,\n msglibSendOpcode,\n profile,\n gasValue = OAppFlowGas['Channel.LZ_RECEIVE_PREPARE_ABA'],\n}: LzReceiveExpectArgs): Promise<MdPacketSent> {\n const { oApp, channel, controller, endpoint } = oAppFixture\n\n const extraTransactions: FlatTransactionComparable[] = [\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: msglibConnection!.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_SEND),\n success: true,\n },\n {\n from: msglibConnection!.address,\n to: msglib!.address,\n op: Number(msglibSendOpcode),\n success: true,\n },\n {\n from: msglib!.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 return lzReceiveAndExpect({\n lzReceivePrepareMd,\n oAppFixture,\n deployer,\n eventHandler,\n msglib,\n msglibConnection,\n expectedLastEvent,\n msglibSendOpcode,\n profile,\n gasValue,\n extraTransactions,\n })\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 assertCommittableView(\n ulnConnection: SandboxContract<TonContractWrapper>,\n nonce: bigint,\n packet: Cell,\n defaultUlnReceiveConfig: Cell\n): Promise<bigint> {\n return (\n (\n await ulnConnection.getViewFunction('committableView', [\n { type: 'int', value: nonce },\n { type: 'cell', cell: packet },\n { type: 'cell', cell: defaultUlnReceiveConfig },\n ])\n ).pop() as TupleItemInt\n ).value\n}\n\nexport async function assertVerifiedView(\n contract: ExtendedContract<TonContractWrapper>,\n dvnAddress: bigint,\n nonce: bigint,\n packetHash: bigint,\n requiredConfirmations: bigint\n): Promise<bigint> {\n const args: TupleItem[] = [\n { type: 'int', value: dvnAddress },\n { type: 'int', value: nonce },\n { type: 'int', value: packetHash },\n { type: 'int', value: requiredConfirmations },\n ]\n return (await contract.getViewFunction('verifiedView', args)).readBigNumber()\n}\n\nexport async function getExecutionStatus(\n contract: ExtendedContract<TonContractWrapper>,\n incomingNonce: bigint\n): Promise<bigint> {\n const args: TupleItem[] = [{ type: 'int', value: incomingNonce }]\n return (await contract.getViewFunction('_viewExecutionStatus', args)).readBigNumber()\n}\n\n// ===============================DEPLOYING CONTRACTS===============================\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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\n// ============================== ZRO HELPER FUNCTIONS==============================\n\nexport const zroOnchainMetaData = {\n name: 'LayerZero',\n symbol: 'ZRO',\n decimals: '9',\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\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 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 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 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 function isValidAscii(input: string): boolean {\n for (let i = 0; i < input.length; i++) {\n if (input.charCodeAt(i) > 127) {\n return false\n }\n }\n return true\n}\n\nexport async function txDecoder(\n contract: SandboxContract<TonContractWrapper>,\n internalMsgResults: SendMessageResult\n): Promise<void> {\n // Create a Set to store unique messages\n const uniqueMessages = new Set<Cell>()\n\n // Collect all inMessages and outMessages\n for (const tx of internalMsgResults.transactions) {\n if (tx.inMessage?.body) {\n uniqueMessages.add(tx.inMessage.body)\n }\n if (tx.inMessage?.init?.data) {\n uniqueMessages.add(tx.inMessage.init.data)\n }\n for (const outMsg of tx.outMessages.values()) {\n uniqueMessages.add(outMsg.body)\n }\n }\n\n // Decode all unique messages and their first refs\n for (const msg of uniqueMessages) {\n await runtimeDecoder(contract, msg).catch(() => {})\n\n // Try to decode all refs in body\n const { refs } = msg\n for (const ref of refs) {\n await runtimeDecoder(contract, ref).catch(() => {})\n }\n }\n}\n\nexport async function runtimeDecoder(contract: SandboxContract<TonContractWrapper>, obj: Cell): Promise<void> {\n const { tonObjects } = require('${options.relativeSrcPath}/offchain-helpers/allObjects') as { [key: string]: { [key: string]: any } }\n\n const typeName = await contract.getTypeOf(obj)\n\n const tonObjectDefKey = keyMap[typeName] ?? ('' as any)\n // if key not found, return early\n if (tonObjectDefKey === '') {\n return\n }\n\n // find the corresponding decoder function for your ton object\n const decoderFn = deconstructorMap[typeName as keyof typeof deconstructorMap]\n const decoded = await decoderFn(contract, obj)\n\n // Get the corresponding ton object definition\n const tonObjectDef = tonObjects[tonObjectDefKey as keyof typeof tonObjects] as { [key: string]: any }\n // cast a copy of it to any so we can modify the attributes\n const tonObjectDefCopy = tonObjectDef\n\n // Iterate through the properties of the ton object definition\n for (const [key, value] of Object.entries(tonObjectDef)) {\n if (!isNaN(parseInt(key))) {\n // Skip non-numeric keys like 'name'\n const jsonField = value as { fieldName: string; fieldType: string }\n const jsonFieldNameParts = jsonField.fieldName.split('::')\n const fieldName = jsonFieldNameParts[jsonFieldNameParts.length - 1]\n\n // Throw if decoded doesn't have this field\n if (!Object.keys(decoded).includes(fieldName)) {\n throw new Error(\\`Field \\${fieldName} not found in decoded object\\`)\n }\n\n const field = decoded[fieldName as keyof typeof decoded] as Cell | bigint | LzDict\n\n // If field is an objRef, try to decode the corresponding decoded value\n if (jsonField.fieldType === 'cl::t::objRef' && field instanceof Cell) {\n let newCellFieldType = await contract.getTypeOf(field)\n if (newCellFieldType === 'NULL') {\n newCellFieldType = 'cl::t::cellRef'\n } else {\n // Check if newCellFieldType is valid ASCII\n if (!isValidAscii(newCellFieldType)) {\n newCellFieldType = 'cl::t::cellRef'\n } else {\n newCellFieldType = keyMap[newCellFieldType] ?? newCellFieldType\n }\n }\n jsonField.fieldType = newCellFieldType\n tonObjectDefCopy[key] = jsonField\n newTonObjectsContainer.items[tonObjectDefKey] = tonObjectDefCopy\n await runtimeDecoder(contract, field)\n } else {\n continue\n }\n }\n }\n newTonObjectsContainer.items[tonObjectDefKey] = tonObjectDefCopy\n}\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateSmlTestUtils(directory: string, filename: string, optionsInput?: SharedGeneratorOptions): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import { Cell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, SendMessageResult, TreasuryContract } from '@ton/sandbox'\nimport '@ton/test-utils'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.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 { Profile, addressToBigInt, cellFromArtifact, sendInternalMessageAndExpect, } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n addMsgLibToController,\n emptyObject,\n protocolSetupGas,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\nimport { LzEventHandler, OPCODES, TonContractWrapper } from '${options.relativeSrcPath}'\n\nconst SML_MANAGER_DEFAULT_VERSION = BigInt(1)\nconst SML_MANAGER_CUSTOM_VERSION = BigInt(2)\n\n// ==============================SML INTEGRATION FUNCTIONS==============================\n\nexport async function commitVerificationAndExpectSml(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n { endpoint, channel, msglibManager: smlManager, msglibConnection: smlConnection, controller }: 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\n// ===============================HELPER ASSERTS===============================\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 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.msglibManager, srcFixture.msglibConnection] = 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.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n // in SML, the connection is the Msglib\n srcFixture.msglib = new Map()\n srcFixture.msglib.set(srcFixture.eid, srcFixture.msglibConnection)\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\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\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateUlnTestUtils(directory: string, filename: string, optionsInput?: SharedGeneratorOptions): void {\n const options = getSharedOptions(optionsInput)\n\n const savedCode = `import { Address, Cell, TupleItemCell, beginCell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, SendMessageResult, TreasuryContract } from '@ton/sandbox'\nimport { FlatTransactionComparable } from '@ton/test-utils'\nimport { ethers } from 'ethers'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport DvnArtifact from '@layerzerolabs/layerzero-v2-ton/build/Dvn.compiled.json'\nimport DvnFeelibArtifact from '@layerzerolabs/layerzero-v2-ton/build/DvnFeeLib.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.compiled.json'\nimport ExecutorArtifact from '@layerzerolabs/layerzero-v2-ton/build/Executor.compiled.json'\nimport ExecutorFeelibArtifact from '@layerzerolabs/layerzero-v2-ton/build/ExecutorFeeLib.compiled.json'\nimport PriceFeedCacheArtifact from '@layerzerolabs/layerzero-v2-ton/build/PriceFeedCache.compiled.json'\nimport PriceFeedFeeLibDefaultArtifact from '@layerzerolabs/layerzero-v2-ton/build/PriceFeedFeeLibDefault.compiled.json'\nimport MaliciousFeeLibArtifact from '@layerzerolabs/layerzero-v2-ton/build/MaliciousFeeLib.compiled.json'\nimport ProxyArtifact from '@layerzerolabs/layerzero-v2-ton/build/Proxy.compiled.json'\nimport UlnArtifact from '@layerzerolabs/layerzero-v2-ton/build/Uln.compiled.json'\nimport UlnConnectionArtifact from '@layerzerolabs/layerzero-v2-ton/build/UlnConnection.compiled.json'\nimport UlnManagerArtifact from '@layerzerolabs/layerzero-v2-ton/build/UlnManager.compiled.json'\nimport { BlueprintArtfiact, ExtendedContract, Profile, addressToBigInt, cellFromArtifact, sendInternalMessageAndExpect, sendMessageViaMultisigAndExpect, LzDict, createSignatures, createVerifierDictSetFromEtherWallets, generateRandomVerifierSet } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n ProtocolFixture,\n SIGNATURE_BYTE_LENGTH,\n addMsgLibToController,\n createLzPacketFromPacketEncoded,\n emptyObject,\n protocolSetupGas,\n publicKeyToHash,\n requireDefined,\n serializeAddressList,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\n\nimport {\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n} from '${options.relativeSrcPath}'\n\nconst ULN_MANAGER_DEFAULT_VERSION = BigInt(1)\n\nexport const TRUE = BigInt(-1)\nexport const FALSE = BigInt(0)\nexport const UlnConnectionVerificationStatusVerifying = BigInt(0)\nexport const UlnConnectionVerificationStatusCommittable = BigInt(1)\nexport const ChannelExecutionStatusExecutable = BigInt(2)\n\nexport interface SendUlnConfig {\n workerQuoteGasLimit: bigint\n maxMessageBytes: bigint\n}\n\nexport interface ReceiveUlnConfig {\n minCommitPacketGas: bigint\n}\n\nexport interface UlnConfig {\n send: SendUlnConfig\n receive: ReceiveUlnConfig\n}\n\nexport interface SendDvnConfig {\n numReqDvns: bigint\n numOptDvns: bigint\n}\n\nexport interface ReceiveDvnConfig {\n numReqDvns: bigint\n numOptDvns: bigint\n optDvnQuorum: bigint\n}\n\nexport interface DvnConfigs {\n send: SendDvnConfig\n receive: ReceiveDvnConfig\n}\n\nexport interface DvnConfig {\n src: DvnConfigs\n dst: DvnConfigs\n}\n\nexport interface CustomConfigs {\n ulnConfig?: UlnConfig\n dvnConfig?: DvnConfig\n}\n\nexport interface WorkerFixture {\n admins: SandboxContract<TreasuryContract>[]\n proxy: SandboxContract<TonContractWrapper>\n}\n\nexport interface DvnFixture extends WorkerFixture {\n dvn: SandboxContract<TonContractWrapper>\n verifiers: ethers.Wallet[]\n}\n\nexport interface ExecutorFixture extends WorkerFixture {\n executor: SandboxContract<TonContractWrapper>\n}\n\nexport interface PricedfeedCacheFixture extends WorkerFixture {\n priceFeedCache: SandboxContract<TonContractWrapper>\n}\n\nexport interface ProtocolFixtureULN extends ProtocolFixture {\n sendDvnFixtures: DvnFixture[]\n sendDvnFixturesCustom: DvnFixture[]\n receiveDvnFixtures: DvnFixture[]\n receiveDvnFixturesCustom: DvnFixture[]\n executorFixtures: ExecutorFixture\n priceFeedCacheFixtures: Map<bigint, PricedfeedCacheFixture>\n defaultUlnSendConfig: Cell\n defaultUlnReceiveConfig: Cell\n}\n\n// ===============================INTERFACES===============================\nexport interface OAppFixtureULN extends ProtocolFixtureULN, OAppFixture {}\n\nexport function serializeDvns(dvnList: bigint[]): Cell {\n const numPayees = dvnList.length\n\n if (numPayees === 0) {\n return beginCell().endCell()\n }\n\n let linkedList = beginCell()\n let idx = 1\n\n while (idx <= numPayees) {\n const address = dvnList[numPayees - idx]\n\n if (idx % 3 === 0) {\n linkedList = beginCell().storeRef(linkedList.endCell()).storeUint(address, 256) // store address as 256-bit integer\n } else {\n linkedList = linkedList.storeUint(address, 256)\n }\n\n idx += 1\n }\n\n return linkedList.endCell()\n}\n\n// ==============================ULN INTEGRATION FUNCTIONS==============================\n\nexport async function commitVerificationAndExpect(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n {\n endpoint,\n channel,\n msglib: uln,\n msglibManager: ulnManager,\n msglibConnection: ulnConnection,\n controller,\n }: OAppFixture,\n dstEid: bigint,\n profile?: Profile\n): Promise<void> {\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: deployer.getSender(),\n contract: msglib,\n opCode: OPCODES.Uln_OP_ULN_COMMIT_PACKET,\n md: await ulnManager.getNewMdMdAddress({\n md: lzPacketCell,\n address: addressToBigInt(ulnConnection.address),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: msglib.address,\n op: Number(OPCODES.Uln_OP_ULN_COMMIT_PACKET),\n success: true,\n },\n {\n from: msglib.address,\n to: ulnConnection.address,\n op: Number(OPCODES.UlnConnection_OP_ULN_CONNECTION_COMMIT_PACKET),\n success: true,\n },\n {\n from: ulnConnection.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: ulnConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: ulnConnection.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, ulnManager)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\n// ===============================DEPLOYING CONTRACTS===============================\n\nexport async function addUlnWorker(\n sender: SandboxContract<TreasuryContract>,\n worker: SandboxContract<TonContractWrapper>,\n workerCallMd: Cell,\n expectedTransactions: FlatTransactionComparable[]\n): Promise<SendMessageResult> {\n return sendInternalMessageAndExpect({\n value: toNano('300'),\n sender: sender.getSender(),\n contract: worker,\n opCode: OPCODES.Worker_OP_CALL_VIA_PROXY,\n md: workerCallMd,\n expectedTransactions,\n balanceRefill: toNano('0'),\n })\n}\n\nexport async function addDvnWorkers(\n allStorages: SandboxContract<TonContractWrapper>,\n { msglibManager, msglib: uln }: OAppFixtureULN,\n sendDvnFixtures: DvnFixture[],\n receiveDvnFixtures: DvnFixture[],\n dstEid: bigint,\n priceFeedCacheAddress: Address,\n eventHandler: LzEventHandler,\n addMaliciousWorker = false\n): Promise<void> {\n requireDefined(sendDvnFixtures)\n requireDefined(receiveDvnFixtures)\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\n let feelibArtifact: BlueprintArtfiact\n if (addMaliciousWorker) {\n feelibArtifact = MaliciousFeeLibArtifact\n } else {\n feelibArtifact = DvnFeelibArtifact\n }\n for (const dvnFixture of [...sendDvnFixtures, ...receiveDvnFixtures]) {\n const dvnWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(msglibManager.address),\n forwardingAddress: 0n,\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(dvnFixture.dvn.address),\n workerFeelibBytecode: cellFromArtifact(feelibArtifact),\n workerFeelibStorage: await allStorages.getNewDvnFeelib({\n quorum: BigInt(0),\n remoteGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(priceFeedCacheAddress),\n dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n })\n\n const internalMsgResults = await addUlnWorker(dvnFixture.admins[0], dvnFixture.dvn, dvnWorkerCallMd, [\n {\n from: dvnFixture.admins[0].address,\n to: dvnFixture.dvn.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: dvnFixture.dvn.address,\n to: dvnFixture.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: dvnFixture.proxy.address,\n to: msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ])\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, msglibManager)\n }\n}\n\nexport function getDvnArrayFromDvnFixtures(\n dvnFixtures: DvnFixture[],\n dvnConfig: SendDvnConfig | ReceiveDvnConfig\n): [bigint[], bigint[], bigint] {\n const dvnArray: bigint[] = []\n const optArray: bigint[] = []\n for (let i = 0; i < dvnConfig.numReqDvns + dvnConfig.numOptDvns; i++) {\n if (i < dvnConfig.numReqDvns) {\n dvnArray.push(addressToBigInt(dvnFixtures[i].proxy.address))\n } else {\n optArray.push(addressToBigInt(dvnFixtures[i].proxy.address))\n }\n }\n return [dvnArray, optArray, 'optDvnQuorum' in dvnConfig ? dvnConfig.optDvnQuorum : BigInt(0)]\n}\n\nexport async function openAndDeployUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n deployMd: Cell,\n srcFixture: OAppFixture,\n dstEid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const uln: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnArtifact),\n await allStorages.getNewUln({\n owner: addressToBigInt(srcFixture.msglibManager.address),\n eid: srcFixture.eid,\n dstEid,\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.UlnManager_OP_DEPLOY_ULN,\n deployMd,\n { value: toNano('10') },\n toNano('0')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_DEPLOY_ULN),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: uln.address,\n success: true,\n deploy: true,\n },\n {\n from: uln.address,\n to: srcFixture.multisig.address,\n success: true,\n },\n ],\n })\n\n requireDefined(uln)\n // Initialize Map if it doesn't exist , otherwise preserve existing entries\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (srcFixture.msglib == undefined) {\n srcFixture.msglib = new Map()\n }\n srcFixture.msglib.set(dstEid, uln)\n return [uln, internalMsgResults]\n}\n\nexport async function openAndDeployUlnManagerViaMultisig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n fixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const ulnManager: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnManagerArtifact),\n await allStorages.getNewUlnManager({\n owner: addressToBigInt(fixture.multisig.address),\n ulnCode: cellFromArtifact(UlnArtifact),\n connectionCode: cellFromArtifact(UlnConnectionArtifact),\n controllerAddress: addressToBigInt(fixture.controller.address),\n eid: fixture.eid,\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: fixture.multisig,\n messageBody: fixture.controller.buildRequest(\n OPCODES.BaseInterface_OP_INITIALIZE,\n await allStorages.getNewMdInitUlnManager({\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: ulnManager,\n deploy: true,\n expectedTransactions: [\n {\n from: fixture.multisig.address,\n to: ulnManager.address,\n success: true,\n },\n ],\n })\n\n return [ulnManager, internalMsgResults]\n}\n\nexport async function openAndDeployUlnConnection(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const msglib = srcFixture.msglib.get(dstFixture.eid)\n requireDefined(msglib)\n const ulnConnection: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(UlnConnectionArtifact),\n await allStorages.getNewUlnConnection({\n owner: addressToBigInt(srcFixture.msglibManager.address),\n path: srcFixture.path,\n ulnAddress: addressToBigInt(msglib.address),\n })\n )\n )\n\n const initUlnConnectionMd = await allStorages.getNewMdInitUlnConnection({\n ulnSendConfigOApp: await allStorages.getNewUlnSendConfigNewWithDefaults(),\n ulnReceiveConfigOApp: await allStorages.getNewUlnReceiveConfigNewWithDefaults(),\n endpointAddress: BigInt(0),\n channelAddress: BigInt(0),\n })\n\n let deployMd = await allStorages.getNewMdDeploy({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n })\n\n deployMd = (\n (\n await allStorages.getViewFunction('cl::set', [\n { type: 'cell', cell: deployMd },\n { type: 'int', value: 3n },\n { type: 'cell', cell: initUlnConnectionMd },\n ])\n ).pop() as TupleItemCell\n ).cell\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: deployMd,\n address: addressToBigInt(srcFixture.msglibManager.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: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_DEPLOY_CONNECTION),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: ulnConnection.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [ulnConnection, internalMsgResults]\n}\n\nexport async function openAndDeployProxyWorker(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n worker: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // 1) deploy the worker\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: worker,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: worker.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 2) construct proxy storage // admins is worker\n const proxy = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ProxyArtifact),\n await allStorages.getNewProxy({\n admins: serializeAddressList([srcFixture.owner, worker]),\n version: 0n,\n })\n )\n )\n\n // 3) deploy proxy\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: proxy,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: proxy.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 4) call worker::setProxy\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: worker,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: worker.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_PROXY,\n md: await allStorages.getNewMdSetAddress({\n address: addressToBigInt(proxy.address),\n }),\n balanceRefill: toNano('0'),\n })\n\n return [worker, proxy, internalMsgResults]\n}\n\nexport async function openAndDeployDvnAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n adminSet: SandboxContract<TreasuryContract>[],\n verifierSet: ethers.Wallet[],\n version: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const dvn = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(DvnArtifact),\n await allStorages.getNewDvn({\n admins: serializeAddressList(adminSet),\n version: version,\n quorum: 1n,\n verifiers: createVerifierDictSetFromEtherWallets(verifierSet),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, dvn, srcFixture)\n}\n\nexport async function openAndDeployExecutorAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n adminSet: SandboxContract<TreasuryContract>[]\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const executor = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ExecutorArtifact),\n await allStorages.getNewExecutor({\n admins: serializeAddressList(adminSet),\n version: 0n,\n nativeDropTotalCap: BigInt(1),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, executor, srcFixture)\n}\n\nexport async function openAndDeployPriceFeedCacheAndProxy(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstEid: bigint,\n adminSet: SandboxContract<TreasuryContract>[]\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // todo: fix this with real values\n const priceFeedCache = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(PriceFeedCacheArtifact),\n await allStorages.getNewPriceFeedCache({\n // owner: addressToBigInt(srcFixture.multisig.address),\n admins: serializeAddressList(adminSet),\n version: 0n,\n dstEid,\n priceFeedFeeLib: await allStorages.getNewPriceFeedFeelib({\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n })\n )\n )\n\n return openAndDeployProxyWorker(blockchain, allStorages, priceFeedCache, srcFixture)\n}\n\nexport async function registerUlnWorkerInfo(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n ulnWorkerFeelibBytecodeCell: Cell\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.UlnManager_OP_REGISTER_WORKER_FEELIB_BYTECODE,\n ulnWorkerFeelibBytecodeCell,\n { value: toNano('1') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_REGISTER_WORKER_FEELIB_BYTECODE),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.multisig.address,\n },\n ],\n })\n}\n\nexport async function deployConfigAndRegisterDvn(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n fixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n dvnConfigs: DvnConfigs\n): Promise<[DvnFixture[], DvnFixture[]]> {\n const dvnAdmins = [fixture.owner]\n const verifierSet = generateRandomVerifierSet(3)\n\n const sendDvnFixtures: DvnFixture[] = []\n const receiveDvnFixtures: DvnFixture[] = []\n\n for (let i = 0; i < dvnConfigs.send.numReqDvns + dvnConfigs.send.numOptDvns; i++) {\n const [dvn, dvnProxy, dvnMsgResults] = await openAndDeployDvnAndProxy(\n blockchain,\n allStorages,\n fixture,\n dvnAdmins,\n verifierSet,\n BigInt(i)\n )\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n sendDvnFixtures.push({\n dvn,\n proxy: dvnProxy,\n admins: dvnAdmins,\n verifiers: verifierSet,\n })\n await eventHandler.addCurrentEventsToAllEvents(dvnMsgResults, dvn)\n }\n\n const randomNumber = Math.floor(Math.random() * 10) + 100\n for (let i = 0; i < dvnConfigs.receive.numReqDvns + dvnConfigs.receive.numOptDvns; i++) {\n const [dvn, dvnProxy, dvnMsgResults] = await openAndDeployDvnAndProxy(\n blockchain,\n allStorages,\n fixture,\n dvnAdmins,\n verifierSet,\n BigInt(randomNumber + i)\n )\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n receiveDvnFixtures.push({\n dvn,\n proxy: dvnProxy,\n admins: dvnAdmins,\n verifiers: verifierSet,\n })\n await eventHandler.addCurrentEventsToAllEvents(dvnMsgResults, dvn)\n }\n\n return [sendDvnFixtures, receiveDvnFixtures]\n}\n\nexport async function deployConfigAndRegisterUln(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n ulnConfigs: UlnConfig,\n version: bigint,\n eventHandler: LzEventHandler,\n dvnConfigs: DvnConfigs\n): Promise<SandboxContract<TonContractWrapper>> {\n // ===================================open and deploy uln manager =====================================\n\n const [msglibManager, ulnManagerMsgResults] = await openAndDeployUlnManagerViaMultisig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture\n )\n await eventHandler.addCurrentEventsToAllEvents(ulnManagerMsgResults, msglibManager)\n srcFixture.msglibManager = msglibManager\n\n // ===================================open and deploy dvn =====================================\n ;[srcFixture.sendDvnFixtures, srcFixture.receiveDvnFixtures] = await deployConfigAndRegisterDvn(\n blockchain,\n allStorages,\n srcFixture,\n eventHandler,\n dvnConfigs\n )\n\n // ===================================open and deploy executor=====================================\n\n const executorAdmins = [srcFixture.owner]\n const [executor, executorProxy, executorMsgResults] = await openAndDeployExecutorAndProxy(\n blockchain,\n allStorages,\n srcFixture,\n executorAdmins\n )\n srcFixture.executorFixtures = {\n executor,\n proxy: executorProxy,\n admins: executorAdmins,\n }\n await eventHandler.addCurrentEventsToAllEvents(executorMsgResults, executor)\n\n // ===================================open and deploy PriceFeedCache & Proxy=======================\n\n const priceFeedCacheAdmins = [srcFixture.owner]\n const [priceFeedCache, priceFeedCacheProxy, priceFeedCacheMsgResults] = await openAndDeployPriceFeedCacheAndProxy(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture.eid,\n priceFeedCacheAdmins\n )\n srcFixture.priceFeedCacheFixtures = new Map([\n [\n dstFixture.eid,\n {\n priceFeedCache,\n proxy: priceFeedCacheProxy,\n admins: priceFeedCacheAdmins,\n },\n ],\n ])\n await eventHandler.addCurrentEventsToAllEvents(priceFeedCacheMsgResults, priceFeedCache)\n\n // ===================================registerUlnWorkerInfo - dvnFeeLib=======================================\n\n let internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(DvnFeelibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================registerUlnWorkerInfo - maliciousFeeLib=======================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(MaliciousFeeLibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ============================registerUlnWorkerInfo - executorFeeLib=======================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(ExecutorFeelibArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ============================registerUlnWorkerInfo - priceFeeLib(empty bytes)================================\n\n internalMsgResults = await registerUlnWorkerInfo(\n blockchain,\n multiSigners,\n srcFixture,\n await allStorages.getNewMdUlnWorkerFeelibBytecode({\n bytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n })\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================open and deploy uln =============================================\n\n const [uln, ulnMsgResults] = await openAndDeployUln(\n blockchain,\n allStorages,\n multiSigners,\n await allStorages.getNewMdDeployNewWithExtraInfo({\n initialDeposit: toNano('2'),\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n extraInfo: await allStorages.getNewMdInitUln({\n connectionCode: beginCell().endCell(),\n treasuryFeeBps: 100n, // 100bps todo: turn this into a constant\n }),\n }),\n srcFixture,\n dstFixture.eid\n )\n requireDefined(uln)\n // Initialize Map if it doesn't exist, otherwise preserve existing entries\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (srcFixture.msglib === undefined) {\n srcFixture.msglib = new Map()\n }\n srcFixture.msglib.set(dstFixture.eid, uln)\n await eventHandler.addCurrentEventsToAllEvents(ulnMsgResults, uln)\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstFixture.eid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixtures,\n srcFixture.receiveDvnFixtures,\n dstFixture.eid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n // ===================================addUlnWorker - executor =======================================\n\n const executorWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(executor.address),\n workerFeelibBytecode: cellFromArtifact(ExecutorFeelibArtifact),\n workerFeelibStorage: await allStorages.getNewExecutorFeelib({\n lzReceiveBaseGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n nativeCap: BigInt(0),\n lzComposeBaseGas: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(priceFeedCacheProxy.address),\n dstEid: dstFixture.eid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n const msglib = srcFixture.msglib.get(dstFixture.eid)\n requireDefined(msglib)\n\n internalMsgResults = await addUlnWorker(srcFixture.executorFixtures.admins[0], executor, executorWorkerCallMd, [\n {\n from: srcFixture.executorFixtures.admins[0].address,\n to: executor.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: executor.address,\n to: srcFixture.executorFixtures.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ])\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================addUlnWorker - priceFeedCache =======================================\n\n const priceFeedCacheWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(priceFeedCacheProxy.address),\n workerFeelibBytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n workerFeelibStorage: await allStorages.getNewPriceFeedFeelib({\n // priceRatio: BigInt(0),\n // gasPriceInUnit: BigInt(0),\n // gasPerByte: BigInt(0),\n // nativePriceUsd: BigInt(0),\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n friendWorkerAddress: BigInt(0),\n dstEid: dstFixture.eid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n\n internalMsgResults = await addUlnWorker(\n priceFeedCacheFixture.admins[0],\n priceFeedCache,\n priceFeedCacheWorkerCallMd,\n [\n {\n from: priceFeedCacheFixture.admins[0].address,\n to: priceFeedCache.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: priceFeedCache.address,\n to: priceFeedCacheProxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: priceFeedCacheProxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================configure default send and receive config =====================================\n\n // requireDefined(srcFixture.dvnFixtures)\n // const [reqDvns, optDvns, optThreshold] = getDvnArrayFromDvnFixtures(srcFixture.dvnFixtures, dvnConfig)\n requireDefined(srcFixture.sendDvnFixtures)\n const [reqSendDvns, optSendDvns] = getDvnArrayFromDvnFixtures(srcFixture.sendDvnFixtures, dvnConfigs.send)\n\n const ulnSendConfig = await allStorages.getNewUlnSendConfig({\n workerQuoteGasLimit: ulnConfigs.send.workerQuoteGasLimit,\n maxMessageBytes: ulnConfigs.send.maxMessageBytes,\n executorNull: BigInt(0),\n executor: addressToBigInt(executorProxy.address),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqSendDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optSendDvns),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n })\n\n srcFixture.defaultUlnSendConfig = ulnSendConfig\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG,\n await allStorages.getNewMdMdEid({\n md: ulnSendConfig,\n eid: dstFixture.eid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n ],\n })\n\n requireDefined(srcFixture.receiveDvnFixtures)\n const [reqReceiveDvns, optReceiveDvns, optReceiveQuorum] = getDvnArrayFromDvnFixtures(\n srcFixture.receiveDvnFixtures,\n dvnConfigs.receive\n )\n\n const ulnReceiveConfig = await allStorages.getNewUlnReceiveConfig({\n minCommitPacketGasNull: BigInt(0),\n minCommitPacketGas: ulnConfigs.receive.minCommitPacketGas,\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqReceiveDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optReceiveDvns),\n optionalDVNThreshold: BigInt(optReceiveQuorum),\n })\n\n srcFixture.defaultUlnReceiveConfig = ulnReceiveConfig\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG,\n await allStorages.getNewMdMdEid({\n md: ulnReceiveConfig,\n eid: dstFixture.eid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n ],\n })\n\n return msglibManager\n}\n\nexport async function deployAndRegisterNewUln(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n priceFeedFeeLib: Cell,\n dstEid: bigint,\n dstOApp: SandboxContract<TonContractWrapper>,\n existingDstEid: bigint,\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================open and deploy PriceFeedCache & Proxy=======================\n\n const priceFeedCacheAdmins = [srcFixture.owner]\n const existingPriceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(existingDstEid)\n requireDefined(existingPriceFeedCacheFixture)\n const currentAdminsWorkers = [existingPriceFeedCacheFixture.priceFeedCache]\n\n await registerAdditionalPriceFeedCache(\n blockchain,\n allStorages,\n srcFixture,\n dstEid,\n priceFeedCacheAdmins,\n existingPriceFeedCacheFixture.proxy,\n priceFeedFeeLib,\n currentAdminsWorkers\n )\n\n // ===================================open and deploy uln =============================================\n\n const [uln, ulnMsgResults] = await openAndDeployUln(\n blockchain,\n allStorages,\n multiSigners,\n await allStorages.getNewMdDeployNewWithExtraInfo({\n initialDeposit: toNano('2'),\n dstEid,\n dstOApp: addressToBigInt(dstOApp.address),\n extraInfo: await allStorages.getNewMdInitUln({\n connectionCode: beginCell().endCell(),\n treasuryFeeBps: 100n, // 100bps todo: turn this into a constant\n }),\n }),\n srcFixture,\n dstEid\n )\n srcFixture.msglib.set(dstEid, uln)\n await eventHandler.addCurrentEventsToAllEvents(ulnMsgResults, uln)\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstEid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixtures,\n srcFixture.receiveDvnFixtures,\n dstEid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n // ===================================addUlnWorker - executor =======================================\n\n const executorWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(srcFixture.executorFixtures.executor.address),\n workerFeelibBytecode: cellFromArtifact(ExecutorFeelibArtifact),\n workerFeelibStorage: await allStorages.getNewExecutorFeelib({\n lzReceiveBaseGas: BigInt(0),\n multiplierBps: BigInt(0),\n floorMarginUSD: BigInt(0),\n nativeCap: BigInt(0),\n lzComposeBaseGas: BigInt(0),\n }),\n friendWorkerAddress: addressToBigInt(existingPriceFeedCacheFixture.proxy.address),\n dstEid: dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n const msglib = srcFixture.msglib.get(dstEid)\n requireDefined(msglib)\n\n let internalMsgResults = await addUlnWorker(\n srcFixture.executorFixtures.admins[0],\n srcFixture.executorFixtures.executor,\n executorWorkerCallMd,\n [\n {\n from: srcFixture.executorFixtures.admins[0].address,\n to: srcFixture.executorFixtures.executor.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.executor.address,\n to: srcFixture.executorFixtures.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: srcFixture.executorFixtures.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================addUlnWorker - priceFeedCache =======================================\n\n const priceFeedCacheWorkerCallMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(srcFixture.msglibManager.address),\n callData: await allStorages.getNewUlnWorkerFeelibInfo({\n workerAddress: addressToBigInt(existingPriceFeedCacheFixture.proxy.address),\n workerFeelibBytecode: cellFromArtifact(PriceFeedFeeLibDefaultArtifact),\n workerFeelibStorage: await allStorages.getNewPriceFeedFeelib({\n // priceRatio: BigInt(0),\n // gasPriceInUnit: BigInt(0),\n // gasPerByte: BigInt(0),\n // nativePriceUsd: BigInt(0),\n priceRatio: BigInt(1851851),\n gasPriceInRemoteUnit: BigInt(36000000000),\n gasPerByte: BigInt(1000),\n nativePriceUsd: BigInt(1),\n arbitrumExtension: beginCell().endCell(),\n optimismExtension: beginCell().endCell(),\n }),\n friendWorkerAddress: BigInt(0),\n dstEid,\n rentBalance: toNano('260'),\n isAdmin: BigInt(0),\n }),\n expiration: BigInt(0),\n opcode: OPCODES.UlnManager_OP_ADD_ULN_WORKER,\n forwardingAddress: 0n,\n })\n\n internalMsgResults = await addUlnWorker(\n priceFeedCacheFixture.admins[0],\n priceFeedCacheFixture.priceFeedCache,\n priceFeedCacheWorkerCallMd,\n [\n {\n from: priceFeedCacheFixture.admins[0].address,\n to: priceFeedCacheFixture.priceFeedCache.address,\n op: Number(OPCODES.Worker_OP_CALL_VIA_PROXY),\n success: true,\n },\n {\n from: priceFeedCacheFixture.priceFeedCache.address,\n to: priceFeedCacheFixture.proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: priceFeedCacheFixture.proxy.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.UlnManager_OP_ADD_ULN_WORKER),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_UPDATE_WORKER_FEELIB),\n },\n // emit event Uln::EVENT::ULN_WORKER_REGISTERED\n {\n from: msglib.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ]\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.msglibManager)\n\n // ===================================configure default send and receive config =====================================\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG,\n await allStorages.getNewMdMdEid({\n md: srcFixture.defaultUlnSendConfig,\n eid: dstEid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_SEND_CONFIG),\n },\n ],\n })\n\n await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: allStorages.buildRequest(\n OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG,\n await allStorages.getNewMdMdEid({\n md: srcFixture.defaultUlnReceiveConfig,\n eid: dstEid,\n }),\n { value: toNano('10') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.msglibManager,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.msglibManager.address,\n success: true,\n op: Number(OPCODES.UlnManager_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n {\n from: srcFixture.msglibManager.address,\n to: msglib.address,\n success: true,\n op: Number(OPCODES.Uln_OP_SET_DEFAULT_ULN_RECEIVE_CONFIG),\n },\n ],\n })\n}\n\nexport async function wireFixtureWithUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n ulnConfigCustom?: UlnConfig,\n dvnConfigsCustom?: DvnConfigs\n): Promise<void> {\n // ===================================wire channels=====================================\n\n await wireChannels(blockchain, allStorages, srcFixture, dstFixture, eventHandler)\n\n // ===================================default config =====================================\n\n const ulnConfigDefault: UlnConfig = {\n send: {\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(100000000),\n },\n receive: {\n minCommitPacketGas: BigInt(1),\n },\n }\n\n const dvnConfigsDefault: DvnConfigs = {\n send: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n },\n receive: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n optDvnQuorum: 0n,\n },\n }\n\n // ===================================deploy, configue, and register uln =====================================\n\n srcFixture.msglibManager = await deployConfigAndRegisterUln(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n ulnConfigCustom ?? ulnConfigDefault,\n ULN_MANAGER_DEFAULT_VERSION,\n eventHandler,\n dvnConfigsDefault\n )\n\n // ===================================add msg lib to controller =====================================\n\n let internalMsgResults = await addMsgLibToController(\n blockchain,\n multiSigners,\n srcFixture,\n dstFixture,\n srcFixture.msglibManager\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // ===================================open and deploy uln connection =====================================\n\n const [msglibConnection, ulnConnectionMsgResults] = await openAndDeployUlnConnection(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture\n )\n srcFixture.msglibConnection = msglibConnection\n await eventHandler.addCurrentEventsToAllEvents(ulnConnectionMsgResults, srcFixture.oApp)\n\n // ===================================set default endpoint config=====================================\n\n internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // expect no failures\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n if (dvnConfigsCustom) {\n // ===================================open and deploy dvn =====================================\n\n ;[srcFixture.sendDvnFixturesCustom, srcFixture.receiveDvnFixturesCustom] = await deployConfigAndRegisterDvn(\n blockchain,\n allStorages,\n srcFixture,\n eventHandler,\n dvnConfigsCustom\n )\n\n // ===================================addUlnWorker - dvn =======================================\n\n const priceFeedCacheFixture = srcFixture.priceFeedCacheFixtures.get(dstFixture.eid)\n requireDefined(priceFeedCacheFixture)\n await addDvnWorkers(\n allStorages,\n srcFixture,\n srcFixture.sendDvnFixturesCustom,\n srcFixture.receiveDvnFixturesCustom,\n dstFixture.eid,\n priceFeedCacheFixture.proxy.address,\n eventHandler\n )\n\n const [reqSendDvns, optSendDvns] = getDvnArrayFromDvnFixtures(\n srcFixture.sendDvnFixturesCustom,\n dvnConfigsCustom.send\n )\n\n const ulnSendConfig = await allStorages.getNewUlnSendConfig({\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(1000000000),\n executorNull: BigInt(0),\n executor: addressToBigInt(srcFixture.executorFixtures.proxy.address),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqSendDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optSendDvns),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n })\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_SetLzConfig,\n md: await allStorages.getNewLzConfig({\n path: srcFixture.path,\n forwardingAddress: addressToBigInt(srcFixture.msglibManager.address),\n opCode: OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_SEND_CONFIG as bigint,\n config: ulnSendConfig,\n }),\n balanceRefill: toNano('1'),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_SetLzConfig),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_SEND_CONFIG),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_SET_OAPP_ULN_SEND_CONFIG),\n success: true,\n },\n ],\n })\n\n const [reqReceiveDvns, optReceiveDvns, optReceiveQuorum] = getDvnArrayFromDvnFixtures(\n srcFixture.receiveDvnFixturesCustom,\n dvnConfigsCustom.receive\n )\n\n const ulnReceiveConfig = await allStorages.getNewUlnReceiveConfig({\n minCommitPacketGasNull: BigInt(0),\n minCommitPacketGas: BigInt(1),\n confirmationsNull: BigInt(0),\n confirmations: BigInt(1),\n requiredDVNsNull: BigInt(0),\n requiredDVNs: serializeDvns(reqReceiveDvns),\n optionalDVNsNull: BigInt(0),\n optionalDVNs: serializeDvns(optReceiveDvns),\n optionalDVNThreshold: BigInt(optReceiveQuorum),\n })\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_SetLzConfig,\n md: await allStorages.getNewLzConfig({\n path: srcFixture.path,\n forwardingAddress: addressToBigInt(srcFixture.msglibManager.address),\n opCode: OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_RECEIVE_CONFIG as bigint,\n config: ulnReceiveConfig,\n }),\n balanceRefill: toNano('1'),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_SetLzConfig),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_SET_OAPP_MSGLIB_RECEIVE_CONFIG),\n success: true,\n },\n {\n from: srcFixture.msglibManager.address,\n to: srcFixture.msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_SET_OAPP_ULN_RECEIVE_CONFIG),\n success: true,\n },\n ],\n })\n }\n}\n\nexport async function wireFixturesTogetherWithUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler,\n customConfigs?: CustomConfigs\n): Promise<void> {\n await wireFixtureWithUln(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture,\n dstFixture,\n eventHandler,\n customConfigs?.ulnConfig,\n customConfigs?.dvnConfig?.src\n )\n await wireFixtureWithUln(\n blockchain,\n allStorages,\n multiSigners,\n dstFixture,\n srcFixture,\n eventHandler,\n customConfigs?.ulnConfig,\n customConfigs?.dvnConfig?.dst\n )\n}\n\n// ========================================================= DVN =========================================================\n\nexport const dvnSetupGas = {\n 'Dvn.INITIALIZE': toNano('10'), // 0.235917\n 'Dvn.SET_VERIFIERS': toNano('10'), // 0.235917\n 'Dvn.SET_QUORUM': toNano('10'), // 0.235917\n 'Dvn.SET_ADMINS_BY_QUORUM': toNano('10'), // 0.235917\n 'Dvn.SET_DICT': toNano('10'), // 0.235917\n 'Dvn.SEND_SIGNED_REQUEST': toNano('10'), // 0.235917\n}\n\n// ================================DVN: SEND REQUEST================================\n\ninterface SignAndSendRequestToDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n request: Cell\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n}\n\nexport async function signAndSendRequestToDvn({\n dvn,\n request,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions = [],\n}: SignAndSendRequestToDvnParams): Promise<SendMessageResult> {\n const signedRequest = await allStorages.getNewMdSignedRequest({\n request,\n signatures: createSignatures(request.hash(), verifierSet),\n })\n\n return sendInternalMessageAndExpect({\n value: dvnSetupGas['Dvn.SEND_SIGNED_REQUEST'],\n sender: caller.getSender(),\n contract: dvn as SandboxContract<TonContractWrapper>,\n opCode: incomingOpcode,\n md: signedRequest,\n expectedTransactions,\n })\n}\n\ninterface SetDictOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n newDict: Cell\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n nonce: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n target: bigint\n}\n\nexport async function setDictOnDvn({\n dvn,\n newDict,\n verifierSet,\n caller,\n signedOpcode,\n incomingOpcode,\n nonce,\n target,\n allStorages,\n expectedTransactions = [],\n}: SetDictOnDvnParams): Promise<SendMessageResult> {\n const setDictMd = await dvn.getNewMdSetDict({\n nonce,\n opcode: signedOpcode,\n _dict: newDict,\n target,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: setDictMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\ninterface AssertNewDictParams {\n dvn: ExtendedContract<TonContractWrapper>\n newDict: Cell\n}\n\nexport async function assertNewVerifiers({ dvn, newDict: expectedVerifiers }: AssertNewDictParams): Promise<void> {\n // check that the verifiers are set correctly (checking the hash is enough)\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n expect(dvnStorage.verifiers.asCell().hash()).toEqual(expectedVerifiers.hash())\n}\n\n// ================================DVN QUORUM================================\n\ninterface SetQuorumOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n newQuorum: bigint\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n nonce: bigint\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n target: bigint\n}\n\nexport async function setQuorumOnDvn({\n dvn,\n newQuorum,\n verifierSet,\n caller,\n incomingOpcode,\n signedOpcode,\n nonce,\n allStorages,\n expectedTransactions,\n target,\n}: SetQuorumOnDvnParams): Promise<SendMessageResult> {\n const setQuorumMd = await dvn.getNewMdSetQuorum({\n nonce,\n opcode: signedOpcode,\n quorum: newQuorum,\n target,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: setQuorumMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\nexport async function getDvnQuorum(dvn: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n return dvnStorage.quorum\n}\n\ninterface AssertNewQuorumParams {\n dvn: ExtendedContract<TonContractWrapper>\n expectedQuorum: bigint\n}\n\nexport async function assertNewQuorum({ dvn, expectedQuorum }: AssertNewQuorumParams): Promise<void> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n expect(dvnStorage.quorum).toEqual(expectedQuorum)\n}\n\n// ================================DVN ADMINS================================\n\nexport async function assertNewDvnAdmins({ dvn, newDict: expectedAdmins }: AssertNewDictParams): Promise<void> {\n // check that the admins are set correctly (checking the hash is enough)\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n const coreDvnStorageCell = dvnStorage.workerCoreStorage\n const coreDvnStorage = await TonObjectUnwrapper.getWorkerCoreStorageToTS(dvn, coreDvnStorageCell)\n expect(coreDvnStorage.admins.hash()).toEqual(expectedAdmins.hash())\n}\n\n// ================================DVN NONCES================================\n\nexport async function getDvnNonces(dvn: ExtendedContract<TonContractWrapper>): Promise<{\n setQuorumNonce: bigint\n setVerifiersNonce: bigint\n setAdminsByQuorumNonce: bigint\n}> {\n const storageCell = await dvn.getCurrentStorageCell()\n const dvnToTs = await TonObjectUnwrapper.getDvnToTS(dvn, storageCell)\n return {\n setQuorumNonce: dvnToTs.setQuorumNonce,\n setVerifiersNonce: dvnToTs.setVerifiersNonce,\n setAdminsByQuorumNonce: dvnToTs.setAdminsByQuorumNonce,\n }\n}\n\ninterface AssertNonceSetParams {\n dvn: ExtendedContract<TonContractWrapper>\n whichNonce: 'setVerifiersNonce' | 'setQuorumNonce' | 'setAdminsByQuorumNonce'\n expectedNonce: bigint\n}\n\nexport async function assertNewNonce({ dvn, whichNonce, expectedNonce }: AssertNonceSetParams): Promise<void> {\n const dvnStorageCell = await dvn.getCurrentStorageCell()\n const dvnStorage = await TonObjectUnwrapper.getDvnToTS(dvn, dvnStorageCell)\n\n switch (whichNonce) {\n case 'setVerifiersNonce':\n expect(dvnStorage.setVerifiersNonce).toEqual(expectedNonce)\n break\n case 'setQuorumNonce':\n expect(dvnStorage.setQuorumNonce).toEqual(expectedNonce)\n break\n case 'setAdminsByQuorumNonce':\n expect(dvnStorage.setAdminsByQuorumNonce).toEqual(expectedNonce)\n break\n default:\n // Use a type assertion to ensure whichNonce is treated as a string\n throw new Error(\\`Unknown nonce type: \\${whichNonce as string}\\`)\n }\n}\n\ninterface CallVerifyOnDvnParams {\n dvn: ExtendedContract<TonContractWrapper>\n verifierSet: ethers.Wallet[]\n caller: SandboxContract<TreasuryContract>\n incomingOpcode: bigint\n signedOpcode: bigint\n expiration: bigint\n target: bigint\n callData: Cell\n allStorages: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n forwardingAddress: bigint\n}\n\nexport async function callVerifyOnDvn({\n dvn,\n verifierSet,\n caller,\n incomingOpcode,\n signedOpcode,\n expiration,\n target,\n callData,\n allStorages,\n expectedTransactions,\n forwardingAddress,\n}: CallVerifyOnDvnParams): Promise<SendMessageResult> {\n const executeParamsMd = await dvn.getNewMdExecuteParams({\n expiration,\n target,\n callData,\n opcode: signedOpcode,\n forwardingAddress,\n })\n\n return signAndSendRequestToDvn({\n dvn,\n request: executeParamsMd,\n verifierSet,\n caller,\n incomingOpcode,\n allStorages,\n expectedTransactions,\n })\n}\n\nexport async function ulnVerifyAndExpect(\n allStorages: SandboxContract<TonContractWrapper>,\n mdPacketSent: MdPacketSent,\n msglib: SandboxContract<TonContractWrapper>,\n receiveDvnFixtures: DvnFixture[],\n msglibManager: SandboxContract<TonContractWrapper>,\n msglibConnection: SandboxContract<TonContractWrapper>,\n eventHandler: LzEventHandler,\n confirmations = 1n,\n profile?: Profile\n): Promise<Cell> {\n const oneDayFromNow = BigInt(Math.floor(Date.now() / 1000) + 86400)\n\n const lzPacket = await createLzPacketFromPacketEncoded(mdPacketSent.packetEncoded, allStorages)\n for (const { dvn, proxy, admins, verifiers } of receiveDvnFixtures) {\n const requestMd = await allStorages.getNewMdExecuteParams({\n target: addressToBigInt(dvn.address),\n callData: await allStorages.getNewMdMdAddress({\n md: await allStorages.getNewMdUlnVerification({\n nonce: mdPacketSent.nonce,\n hash: BigInt('0x' + lzPacket.hash().toString('hex')),\n confirmations,\n }),\n address: addressToBigInt(msglibConnection.address),\n }),\n expiration: oneDayFromNow,\n opcode: OPCODES.Uln_OP_ULN_VERIFY,\n forwardingAddress: addressToBigInt(msglib.address),\n })\n\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: admins[0].getSender(),\n contract: dvn,\n opCode: OPCODES.Dvn_OP_VERIFY,\n md: await allStorages.getNewMdSignedRequest({\n request: requestMd,\n signatures: createSignatures(requestMd.hash(), verifiers),\n }),\n expectedTransactions: [\n {\n from: admins[0].address,\n to: dvn.address,\n op: Number(OPCODES.Dvn_OP_VERIFY),\n success: true,\n },\n {\n from: dvn.address,\n to: proxy.address,\n op: Number(OPCODES.Proxy_OP_CALL_CONTRACT),\n success: true,\n },\n {\n from: proxy.address,\n to: msglib.address,\n op: Number(OPCODES.Uln_OP_ULN_VERIFY),\n success: true,\n },\n {\n from: msglib.address,\n to: msglibConnection.address,\n op: Number(OPCODES.UlnConnection_OP_ULN_CONNECTION_VERIFY),\n success: true,\n },\n // emit UlnConnection::EVENT::PACKET_VERIFIED\n {\n from: msglibConnection.address,\n to: msglibManager.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: msglibConnection.address,\n to: proxy.address,\n op: Number(OPCODES.UltraLightNode_OP_ULN_CONNECTION_VERIFY_CALLBACK),\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, dvn)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n }\n\n return lzPacket\n}\n\nexport async function registerAdditionalPriceFeedCache(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixtureULN,\n dstEid: bigint,\n adminSet: SandboxContract<TreasuryContract>[],\n existingProxy: SandboxContract<TonContractWrapper>,\n priceFeedFeeLib: Cell,\n currentAdminsWorkers: SandboxContract<TonContractWrapper>[]\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n // Create new price feed cache worker\n const priceFeedCache = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(PriceFeedCacheArtifact),\n await allStorages.getNewPriceFeedCache({\n admins: serializeAddressList(adminSet),\n version: 0n,\n dstEid,\n priceFeedFeeLib,\n })\n )\n )\n\n // 1) Deploy the worker\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: priceFeedCache,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: priceFeedCache.address,\n deploy: true,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n // 2) Update proxy admins list (including the new worker)\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: existingProxy,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: existingProxy.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_ADMINS,\n md: serializeAddressList([...currentAdminsWorkers, priceFeedCache]),\n balanceRefill: toNano('0'),\n })\n\n // 3) Set proxy on worker\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: srcFixture.owner.getSender(),\n contract: priceFeedCache,\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: priceFeedCache.address,\n success: true,\n },\n ],\n opCode: OPCODES.Worker_OP_SET_PROXY,\n md: await allStorages.getNewMdSetAddress({\n address: addressToBigInt(existingProxy.address),\n }),\n balanceRefill: toNano('0'),\n })\n\n srcFixture.priceFeedCacheFixtures.set(dstEid, {\n priceFeedCache,\n proxy: existingProxy,\n admins: [...adminSet],\n })\n\n return [priceFeedCache, internalMsgResults]\n}\n\nexport async function wireFixtureWithNewUln(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixtureULN,\n dstFixture: OAppFixtureULN,\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================default config =====================================\n\n const ulnConfigDefault: UlnConfig = {\n send: {\n workerQuoteGasLimit: BigInt(100000000),\n maxMessageBytes: BigInt(100000000),\n },\n receive: {\n minCommitPacketGas: BigInt(1),\n },\n }\n\n const dvnConfigsDefault: DvnConfigs = {\n send: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n },\n receive: {\n numReqDvns: 2n,\n numOptDvns: 0n,\n optDvnQuorum: 0n,\n },\n }\n\n // ===================================deploy, configue, and register uln =====================================\n\n srcFixture.msglibManager = await deployConfigAndRegisterUln(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n ulnConfigDefault,\n ULN_MANAGER_DEFAULT_VERSION,\n eventHandler,\n dvnConfigsDefault\n )\n\n // ===================================add msg lib to controller =====================================\n\n let internalMsgResults = await addMsgLibToController(\n blockchain,\n multiSigners,\n srcFixture,\n dstFixture,\n srcFixture.msglibManager\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // ===================================set default endpoint config=====================================\n\n internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManager,\n srcFixture.msglibManager,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n // expect no failures\n expect(eventHandler.allFailures.txList).toHaveLength(0)\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\nexport function setLzTonSdkWriteToConsole(enabled: boolean): void {\n process.env.LZ_TON_SDK_WRITE_TO_CONSOLE = enabled.toString()\n}\n\nexport function setLzTonSdkSaveToJson(enabled: boolean): void {\n process.env.LZ_TON_SDK_SAVE_TO_JSON = enabled.toString()\n}\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 writeToConsole?: boolean\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 let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n\n // Use environment variables if profile flags are not set\n const shouldProfileGas = profile?.profileGas ?? process.env.LZ_TON_SDK_SAVE_TO_JSON === 'true'\n const shouldWriteToConsole = profile?.writeToConsole ?? process.env.LZ_TON_SDK_WRITE_TO_CONSOLE === 'true'\n\n if (shouldProfileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile?.fileName ?? 'gasInfo'}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n\n if (shouldWriteToConsole) {\n console.info(callerStack?.split('\\n')[2].trim())\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\n ? 'UNKNOWN'\n : 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 (shouldProfileGas) 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 }\n if (shouldProfileGas) sortAndSave(filePath, gasInfo)\n}\n","import { Cell, Contract, SendMode, beginCell } 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 { ClasslibWrapper } from './ClasslibWrapper'\nimport { MultiSigOpCodes, Multisig, Order, TransferRequest } from './externalWrappers'\nimport { Profile, printTransactionTrace } from './print-tx-trace'\n\nexport interface SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<ClasslibWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n recursiveDecode?: boolean\n txDecoder?: (contract: SandboxContract<ClasslibWrapper>, internalMsgResults: SendMessageResult) => Promise<void>\n invertedOpcodes?: { [k: string]: string }\n}\n\nexport interface SendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<Contract | ClasslibWrapper>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n recursiveDecode?: boolean\n txDecoder?: (contract: SandboxContract<ClasslibWrapper>, internalMsgResults: SendMessageResult) => Promise<void>\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n recursiveDecode = false,\n txDecoder,\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 (targetContract.init === undefined) {\n throw new Error('targetContract.init is undefined')\n }\n\n if (deploy) {\n const targetContractStateInit = beginCell()\n .storeUint(6, 5)\n .storeRef(targetContract.init!.code ?? beginCell().endCell())\n .storeRef(targetContract.init!.data ?? beginCell().endCell())\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 // that makes sure that the target contract is a sandbox<TonContractWrapper>\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract && txDecoder) {\n await txDecoder(targetContract, internalMsgResults)\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 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 as any).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 as any).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract && txDecoder) {\n await txDecoder(targetContract, internalMsgResults)\n }\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 recursiveDecode = false,\n txDecoder,\n invertedOpcodes,\n}: SendInternalMessageAndExpectArgs): Promise<SendMessageResult> {\n const internalMsgResults = await contract.sendInternalMessage(sender, opCode, md, { value }, balanceRefill, queryId)\n\n if (profile?.profileGas ?? false) {\n const { stack } = new Error()\n printTransactionTrace(internalMsgResults.transactions, invertedOpcodes ?? {}, stack, profile)\n }\n\n if (recursiveDecode && txDecoder) {\n await txDecoder(contract, internalMsgResults)\n }\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 // Use type assertion\n expect(actualTransactions).toHaveTransaction(tx)\n })\n}\n","import { Cell, beginCell, toNano } from '@ton/core'\nimport { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox'\n\nimport { ClasslibWrapper } from './ClasslibWrapper'\nimport { sendInternalMessageAndExpect } from './send-tx'\nimport { BlueprintArtfiact, cellFromArtifact } from './utils'\n\nexport async function openAndDeployAllStoragesTemplate(\n blockchain: Blockchain,\n deployer: SandboxContract<TreasuryContract>,\n artifact: BlueprintArtfiact,\n gasValue: bigint,\n opCode: bigint,\n md: Cell\n): Promise<SandboxContract<ClasslibWrapper>> {\n // ===================================open allStorages=====================================\n\n const allStorages = blockchain.openContract(\n ClasslibWrapper.create(cellFromArtifact(artifact), beginCell().endCell())\n )\n\n // ===================================deploy allStorages=====================================\n\n await sendInternalMessageAndExpect({\n value: gasValue,\n sender: deployer.getSender(),\n contract: allStorages,\n expectedTransactions: [\n {\n from: deployer.address,\n to: allStorages.address,\n deploy: true,\n success: true,\n },\n ],\n opCode,\n md,\n balanceRefill: toNano('1'),\n })\n\n return allStorages\n}\n","import { KeyPair, deriveEd25519Path, keyPairFromSeed, mnemonicToHDSeed, mnemonicToWalletKey } from '@ton/crypto'\nimport { WalletContractV4 } from '@ton/ton'\n\nexport function toPathArray(path: string): number[] {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"')\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/')\n const ret: number[] = Array<number>(parts.length)\n for (let i = 0; i < parts.length; i++) {\n const tmp = /^(\\d{1,10})[hH']$/.exec(parts[i])\n if (tmp === null) {\n throw new Error('Invalid input')\n }\n ret[i] = parseInt(tmp[1], 10)\n\n if (ret[i] >= 0x80000000) {\n throw new Error('Invalid child index')\n }\n }\n return ret\n}\n\nexport async function getTonWalletFromMnemonic(\n mnemonic: string,\n path = \"m/44'/607'/0'/0'/0'\",\n workchain = 0\n): Promise<{ wallet: WalletContractV4; keyPair: KeyPair }> {\n const seed: Buffer = await mnemonicToHDSeed(mnemonic.split(' '))\n const indices: number[] = toPathArray(path)\n const derivedSeed: Buffer = await deriveEd25519Path(seed, indices)\n const keyPair: KeyPair = keyPairFromSeed(derivedSeed)\n return {\n wallet: WalletContractV4.create({\n publicKey: keyPair.publicKey,\n workchain,\n }),\n keyPair,\n }\n}\n\n// Legacy method that should match TonKeeper mnemonic derivation\nexport const getTonWalletFromMnemonicLegacy = async (\n mnemonic: string,\n workchain = 0\n): Promise<{ wallet: WalletContractV4; keyPair: KeyPair }> => {\n const key = await mnemonicToWalletKey(mnemonic.split(' '))\n const wallet = WalletContractV4.create({\n publicKey: key.publicKey,\n workchain,\n })\n return { wallet, keyPair: key }\n}\n","import { BitBuilder, BitString, Builder, Cell, beginCell } from '@ton/core'\n\nimport { MAX_CELL_BITS } from './class/class'\nimport { trim0x } from '../../address-utils'\n\nexport const hexToCells = (hex: string): Cell => {\n const bitString = new BitString(Buffer.from(trim0x(hex), 'hex'), 0, hex.slice(2).length * 4)\n\n const cells: Builder[] = []\n\n let offset = 0\n while (offset < bitString.length) {\n cells.push(beginCell())\n cells[cells.length - 1].storeBits(\n bitString.substring(offset, Math.min(bitString.length - offset, MAX_CELL_BITS))\n )\n offset += MAX_CELL_BITS\n }\n\n if (cells.length === 0) {\n return beginCell().asCell()\n }\n\n cells.reverse()\n\n return cells\n .slice(1)\n .reduce((children, parent) => parent.storeRef(children), cells[0])\n .asCell()\n}\n\nexport const getTotalBits = (cell: Cell): number => {\n const parser = cell.beginParse()\n\n return parser.remainingBits + (parser.remainingRefs > 0 ? getTotalBits(parser.loadRef()) : 0)\n}\n\nexport const getClosestByteAlignedBits = (bits: number): number => {\n return Math.ceil(bits / 8) * 8\n}\n\nexport const cellsToHex = (cell: Cell): string => {\n let parser = cell.beginParse()\n\n const totalBits = getClosestByteAlignedBits(getTotalBits(cell))\n const bitBuilder = new BitBuilder(totalBits)\n\n while (parser.remainingRefs >= 0) {\n const bitsString = parser.loadBits(parser.remainingBits)\n bitBuilder.writeBits(bitsString)\n\n if (parser.remainingRefs === 0) {\n break\n }\n\n parser = parser.loadRef().beginParse()\n }\n\n return `0x${bitBuilder.buffer().toString('hex')}`\n}\n\nexport const calculateCellConsumption = (cell: Cell): { numberOfCells: number; bits: number } => {\n let parser = cell.beginParse()\n\n let numberOfCells = 1\n let bits = parser.remainingBits\n\n while (parser.remainingRefs > 0) {\n parser = parser.loadRef().beginParse()\n numberOfCells++\n bits += parser.remainingBits\n }\n\n return { numberOfCells, bits }\n}\n\nexport const calculateCellConsumptionFromHex = (hex: string): { numberOfCells: number; bits: number } => {\n return calculateCellConsumption(hexToCells(hex))\n}\n","import { Address, Cell, Dictionary, DictionaryKeyTypes, DictionaryValue, beginCell } from '@ton/core'\n\nimport {\n AddressListTypeLike,\n AddressTypeLike,\n BoolTypeLike,\n ClDeclareField,\n ClassTypeLike,\n DecodedAndRaw,\n DictionaryTypeLike,\n NumberTypeLike,\n _getTypeWidth,\n cl,\n clDeclare,\n clGetCellRef,\n clGetUint,\n} from './class'\nimport {\n asciiStringToBigint,\n deserializeAddressList,\n emptyCell,\n emptyPOOO,\n getCellName,\n serializeAddressList,\n} from './helpers'\nimport { bigIntToHex, bigintToAddress } from '../../../address-utils'\nimport { cellsToHex } from '../cells'\n\nconst baseObjects = {\n POOO: {\n '0': {\n fieldName: 'POOO::nextEmpty',\n fieldType: 'cl::t::uint64',\n },\n '1': {\n fieldName: 'POOO::bitmap',\n fieldType: 'cl::t::cellRef',\n },\n name: 'POOO',\n },\n BaseStorage: {\n '0': {\n fieldName: 'BaseStorage::owner',\n fieldType: 'cl::t::address',\n },\n '1': {\n fieldName: 'BaseStorage::authenticated',\n fieldType: 'cl::t::bool',\n },\n '2': {\n fieldName: 'BaseStorage::initialized',\n fieldType: 'cl::t::bool',\n },\n '3': {\n fieldName: 'BaseStorage::initialStorage',\n fieldType: 'cl::t::cellRef',\n },\n name: 'baseStore',\n },\n 'action::event': {\n '0': {\n fieldName: 'action::event::topic',\n fieldType: 'cl::t::uint256',\n },\n '1': {\n fieldName: 'action::event::body',\n fieldType: 'cl::t::objRef',\n },\n '2': {\n fieldName: 'action::event::initialStorage',\n fieldType: 'cl::t::objRef',\n },\n name: 'event',\n },\n} as const\n\nexport type ValueOf<T> = T[keyof T]\n\nexport const fieldTypes = [\n 'cl::t::uint1', // 1 bit\n 'cl::t::bool', // 1 bit\n 'cl::t::uint2', // 2 bits\n 'cl::t::uint4', // 4 bits\n 'cl::t::uint8', // 8 bits\n 'cl::t::uint16', // 16 bits\n 'cl::t::uint32', // 32 bits\n 'cl::t::uint64', // 64 bits\n 'cl::t::uint128', // 128 bits\n 'cl::t::coins', // 128 bits\n 'cl::t::uint256', // 256 bits\n 'cl::t::address', // 256 bits\n 'cl::t::dict256', // cell\n 'cl::t::cellRef', // cell\n 'cl::t::objRef', // cell\n 'cl::t::addressList', // cell\n] as const\n\nexport interface TonObjects {\n [key: string]: {\n name: string\n } & {\n [key in `${number}`]: {\n fieldName: string\n // eslint-disable-next-line no-use-before-define\n fieldType: FieldTypes<TonObjects>\n }\n }\n}\nexport type TonObjectsKeys<_TonObjects extends TonObjects> = keyof _TonObjects & string\n\nexport type FieldTypes<_TonObjects extends TonObjects> = (typeof fieldTypes)[number] | TonObjectsKeys<_TonObjects>\n\nexport type ClassDefinition<_TonObjects extends TonObjects, ClassName extends TonObjectsKeys<_TonObjects>> = Omit<\n _TonObjects[ClassName],\n 'name'\n>\n\nexport type EnhancedAddress = Address & {\n toHex: () => string\n toBigInt: () => bigint\n}\nexport type EnhancedAddressList = EnhancedAddress[] & {\n toHex: () => string[]\n toBigInt: () => bigint[]\n}\n\nexport type EnhancedCell<_TonObjects extends TonObjects> = Cell & {\n getAddressList: () => EnhancedAddressList\n cellsToHex: () => string\n getDict: <V>(valueType: DictionaryValue<V>) => Dictionary<bigint, V>\n decode: <ClassName extends TonObjectsKeys<_TonObjects>>(\n className: ClassName\n // eslint-disable-next-line no-use-before-define\n ) => Fields<_TonObjects, ClassName>\n clGetCellRef: (index: number) => EnhancedCell<_TonObjects>\n clGetUint: (index: number, width: number) => bigint\n getCellName: () => string\n}\n\nexport type LoadableDict<_TonObjects extends TonObjects> = DecodedAndRaw<\n {\n getDict: <V>(valueType: DictionaryValue<V>) => Dictionary<bigint, V>\n },\n EnhancedCell<_TonObjects>\n>\n\nexport type FieldTypeToValue<\n _TonObjects extends TonObjects,\n FieldType,\n ClassType extends ClassTypeLike | EnhancedCell<_TonObjects>,\n NumberType extends NumberTypeLike,\n BoolType extends BoolTypeLike,\n AddressType extends AddressTypeLike,\n AddressListType extends AddressListTypeLike,\n DictionaryType extends DictionaryTypeLike<any>,\n> =\n FieldType extends TonObjectsKeys<_TonObjects>\n ? // The following ternary is to decide between the type used on decode/lzEncodeClass\n [ClassTypeLike] extends [ClassType]\n ? // eslint-disable-next-line no-use-before-define\n Fields<_TonObjects, FieldType, ClassType, NumberType, BoolType, AddressType, AddressListType> | ClassType\n : DecodedAndRaw<\n // eslint-disable-next-line no-use-before-define\n Fields<_TonObjects, FieldType, ClassType, NumberType, BoolType, AddressType, AddressListType>,\n EnhancedCell<_TonObjects>\n >\n : FieldType extends 'cl::t::cellRef' | 'cl::t::objRef'\n ? ClassType\n : FieldType extends 'cl::t::bool'\n ? BoolType\n : FieldType extends 'cl::t::address'\n ? AddressType\n : FieldType extends 'cl::t::addressList'\n ? AddressListType\n : FieldType extends 'cl::t::dict256'\n ? DictionaryType\n : NumberType\n\nexport type Fields<\n _TonObjects extends TonObjects,\n ClassName extends TonObjectsKeys<_TonObjects>,\n ClassType extends ClassTypeLike | EnhancedCell<_TonObjects> = EnhancedCell<_TonObjects>,\n NumberType extends NumberTypeLike = bigint,\n BoolType extends BoolTypeLike = boolean,\n AddressType extends AddressTypeLike = EnhancedAddress,\n AddressListType extends AddressListTypeLike = EnhancedAddressList,\n DictionaryType extends DictionaryTypeLike<any> = LoadableDict<_TonObjects>,\n> =\n ValueOf<ClassDefinition<_TonObjects, ClassName>> extends {\n fieldName: string\n fieldType: FieldTypes<_TonObjects>\n }\n ? {\n [K in ValueOf<\n ClassDefinition<_TonObjects, ClassName>\n > as K['fieldName'] extends `${ClassName}::${infer PropName}` ? PropName : never]: FieldTypeToValue<\n _TonObjects,\n K['fieldType'],\n ClassType,\n NumberType,\n BoolType,\n AddressType,\n AddressListType,\n DictionaryType\n >\n }\n : never\n\nexport const isClassName = <_TonObjects extends TonObjects>(\n _tonObjects: _TonObjects,\n fieldType: FieldTypes<_TonObjects>\n): fieldType is TonObjectsKeys<_TonObjects> => {\n return fieldType in _tonObjects\n}\n\nconst getClassNameAndDefinition =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName\n ): {\n className: ClassName\n classDefinition: (typeof _tonObjects)[ClassName]\n } => {\n let className = _className\n let classDefinition = _tonObjects[className]\n\n // When deep decoding a class that you don't have the whole definition for\n // you can pass the name of the class definition instead of the class name.\n // This works because the first bits of the class are the name itself, so it\n // allows us to decode the class without the full definition.\n if (!(className in _tonObjects)) {\n ;[className, classDefinition] = Object.entries(_tonObjects).find(\n ([_, value]) => value.name === className\n )! as [ClassName, (typeof _tonObjects)[ClassName]]\n throw new Error(`Class ${className} not found`)\n }\n\n return { className, classDefinition }\n }\n\nexport const generateEncodeClass =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName,\n fields: Fields<\n _TonObjects,\n ClassName,\n ClassTypeLike,\n NumberTypeLike,\n BoolTypeLike,\n AddressTypeLike,\n AddressListTypeLike,\n DictionaryTypeLike<any>\n >\n ): Cell => {\n const { className, classDefinition } = getClassNameAndDefinition(_tonObjects)(_className)\n\n const fieldsArray = Object.entries(classDefinition).filter(([_, field]) => typeof field !== 'string') as [\n string,\n { fieldName: string; fieldType: FieldTypes<_TonObjects> },\n ][]\n\n const results = Object.entries(fields)\n .map(([fieldName, fieldValue]) => {\n const [index, field] = fieldsArray.find(\n ([_, field]) => field.fieldName === `${className}::${fieldName}`\n )!\n\n if (field.fieldType === 'cl::t::dict256' && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n (fieldValue as Partial<LoadableDict<_TonObjects>>).rawCell ??\n beginCell()\n .storeDict(fieldValue as Dictionary<DictionaryKeyTypes, unknown>)\n .endCell()\n .asSlice()\n .loadRef(),\n ] as const\n }\n\n if (field.fieldType === 'cl::t::addressList' && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n serializeAddressList(fieldValue as AddressListTypeLike),\n ] as const\n }\n\n if (isClassName(_tonObjects, field.fieldType) && !(fieldValue instanceof Cell)) {\n return [\n Number(index),\n cl.t.objRef,\n generateEncodeClass(_tonObjects)(\n field.fieldType,\n fieldValue as Fields<\n _TonObjects,\n typeof field.fieldType,\n ClassTypeLike,\n NumberTypeLike,\n BoolTypeLike,\n AddressTypeLike,\n AddressListTypeLike,\n DictionaryTypeLike<any>\n >\n ),\n ] as const\n }\n\n const typeMetadata = field.fieldType.split('cl::t::')[1] as keyof typeof cl.t\n let tNumber: number\n if (typeMetadata in cl.t) {\n tNumber = cl.t[typeMetadata]\n } else {\n tNumber = cl.t.objRef\n }\n\n return [Number(index), tNumber, fieldValue, typeMetadata] as const\n })\n .sort(([a], [b]) => a - b)\n .map(([_, type, value, typeMetadata]) => ({\n type,\n value,\n typeMetadata,\n })) as ClDeclareField[]\n\n return clDeclare(asciiStringToBigint(_tonObjects[className].name), results)\n }\n\nexport const generateDecodeClass =\n <_TonObjects extends TonObjects>(_tonObjects: _TonObjects) =>\n <ClassName extends TonObjectsKeys<_TonObjects>>(\n _className: ClassName,\n cell: Cell\n ): Fields<_TonObjects, ClassName> => {\n const { className, classDefinition } = getClassNameAndDefinition(_tonObjects)(_className)\n\n const enhanceCell = (cell: Cell): EnhancedCell<_TonObjects> => {\n return new Proxy(cell, {\n get(target, prop): any {\n if (prop === 'getAddressList') {\n // eslint-disable-next-line no-use-before-define\n return () => enhanceAddressList(cell)\n }\n\n if (prop === 'cellsToHex') {\n return () => cellsToHex(cell)\n }\n\n if (prop === 'getDict') {\n // eslint-disable-next-line no-use-before-define\n return enhancedLoadDict(cell).getDict\n }\n\n if (prop === 'decode') {\n // eslint-disable-next-line no-use-before-define\n return <ClassName extends TonObjectsKeys<_TonObjects>>(className: ClassName) =>\n generateDecodeClass(_tonObjects)(className, cell)\n }\n\n if (prop === 'clGetCellRef') {\n return (index: number) => enhanceCell(clGetCellRef(cell, index))\n }\n\n if (prop === 'clGetUint') {\n return (index: number, width: number) => clGetUint(cell, index, width)\n }\n\n if (prop === 'getCellName') {\n return () => getCellName(cell)\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedCell<_TonObjects>\n }\n\n const injectRawCell = <V extends object>(\n value: V,\n rawCell: Cell\n ): DecodedAndRaw<V, EnhancedCell<_TonObjects>> => {\n return new Proxy(value, {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }) as DecodedAndRaw<V, EnhancedCell<_TonObjects>>\n }\n\n const enhanceAddress = (address: bigint): EnhancedAddress => {\n return new Proxy(bigintToAddress(address), {\n get(target, prop): any {\n if (prop === 'toHex') {\n return () => bigIntToHex(address)\n }\n\n if (prop === 'toBigInt') {\n return () => address\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedAddress\n }\n\n const enhanceAddressList = (rawCell: Cell): DecodedAndRaw<EnhancedAddressList, EnhancedCell<_TonObjects>> => {\n const addressList = deserializeAddressList(rawCell).map(enhanceAddress)\n return injectRawCell(\n new Proxy(addressList, {\n get(target, prop): any {\n if (prop === 'toHex') {\n return () => addressList.map((address) => address.toHex())\n }\n\n if (prop === 'toBigInt') {\n return () => addressList.map((address) => address.toBigInt())\n }\n\n return Reflect.get(target, prop)\n },\n }) as EnhancedAddressList,\n rawCell\n )\n }\n\n const enhancedLoadDict = (rawCell: Cell): LoadableDict<_TonObjects> => {\n return {\n getDict: (value): Dictionary<bigint, any> => {\n return rawCell.bits.length === 0\n ? Dictionary.empty(Dictionary.Keys.BigUint(256), value)\n : rawCell.beginParse().loadDictDirect(Dictionary.Keys.BigUint(256), value)\n },\n rawCell: enhanceCell(rawCell),\n }\n }\n\n return Object.fromEntries(\n (\n Object.entries(classDefinition) as [\n string,\n {\n fieldName: string\n fieldType: FieldTypes<_TonObjects>\n },\n ][]\n )\n .filter(([_, field]) => typeof field !== 'string')\n .map(([index, field]) => {\n const tNumber = cl.t[field.fieldType.split('cl::t::')[1] as keyof typeof cl.t]\n\n const fieldName = field.fieldName.split(`${className}::`)[1]\n\n if (field.fieldType in _tonObjects) {\n const rawCell = clGetCellRef(cell, Number(index))\n\n if (field.fieldType === baseObjects.POOO.name && emptyCell().hash().equals(rawCell.hash())) {\n return [\n fieldName,\n new Proxy(emptyPOOO(), {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }),\n ] as const\n }\n\n return [\n fieldName,\n new Proxy(\n generateDecodeClass(_tonObjects)(field.fieldType, clGetCellRef(cell, Number(index))),\n {\n get(target, prop): any {\n if (prop === 'rawCell') {\n return enhanceCell(rawCell)\n }\n\n return Reflect.get(target, prop)\n },\n }\n ),\n ]\n }\n\n if (field.fieldType === 'cl::t::addressList') {\n const rawCell = clGetCellRef(cell, Number(index))\n\n return [fieldName, enhanceAddressList(rawCell)]\n }\n\n if (field.fieldType === 'cl::t::dict256') {\n return [fieldName, enhancedLoadDict(clGetCellRef(cell, Number(index)))]\n }\n\n if (tNumber === cl.t.objRef) {\n return [fieldName, enhanceCell(clGetCellRef(cell, Number(index)))]\n }\n\n if (field.fieldType === 'cl::t::address') {\n return [fieldName, enhanceAddress(clGetUint(cell, Number(index), _getTypeWidth(tNumber)))]\n }\n\n if (field.fieldType === 'cl::t::bool') {\n return [fieldName, clGetUint(cell, Number(index), _getTypeWidth(tNumber)) === 1n]\n }\n\n return [fieldName, clGetUint(cell, Number(index), _getTypeWidth(tNumber))]\n })\n ) as Fields<_TonObjects, ClassName>\n }\n\nexport const baseEncodeClass = generateEncodeClass(baseObjects)\nexport const baseDecodeClass = generateDecodeClass(baseObjects)\n","import { BitBuilder, BitReader, Builder, Cell, Slice, beginCell } from '@ton/core'\n\nimport { AddressListTypeLike, AddressTypeLike, MAX_CELL_BITS, NAME_WIDTH, NumberTypeLike } from './class'\nimport { baseEncodeClass } from './generators'\nimport { addressToBigInt, addressToHex } from '../../../address-utils'\n\nexport const asciiStringToBigint = (target: string): bigint => {\n return BigInt(`0x${Buffer.from(target).toString('hex')}`)\n}\n\nexport const bigintToAsciiString = (target: bigint): string => {\n return Buffer.from(target.toString(16), 'hex').toString('ascii')\n}\n\nexport const getCellNameNumber = (cell: Cell): bigint => {\n const slice = cell.beginParse()\n const name = slice.loadUintBig(NAME_WIDTH)\n return name\n}\n\nexport const getCellName = (cell: Cell): string => {\n const nameNumber = getCellNameNumber(cell)\n return bigintToAsciiString(nameNumber)\n}\n\nexport const emptyCell = (): Cell => {\n return beginCell().asCell()\n}\n\nexport const nullObject = (): Cell => {\n return emptyCell()\n}\n\nexport const emptyMap = (): Cell => {\n return emptyCell()\n}\n\nexport const emptyPOOO = (): Cell => {\n return baseEncodeClass('POOO', {\n nextEmpty: 1,\n bitmap: ((): Cell => {\n const builder = new BitBuilder(MAX_CELL_BITS)\n builder.writeUint(0, 1023)\n\n const bitString = builder.build()\n const bitReader = new BitReader(bitString)\n const slice = new Slice(bitReader, [])\n\n return slice.asCell()\n })(),\n })\n}\n\nexport const initBaseStorage = (owner: AddressTypeLike): Cell => {\n return baseEncodeClass('BaseStorage', {\n owner,\n authenticated: false,\n initialized: false,\n initialStorage: emptyCell(),\n })\n}\n\nexport function serializeAddressList(addresses: AddressListTypeLike): Cell {\n if (addresses instanceof Cell) {\n return addresses\n }\n\n // Start with array of builders, initialize with first builder\n const addressListBuilder: Builder[] = [beginCell()]\n\n // Iterate through each address\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let idx = 0; idx < addresses.length; idx++) {\n // Check if current builder has enough space for next address (256 bits)\n if (addressListBuilder[addressListBuilder.length - 1].availableBits < 256) {\n // If not enough space, create new builder\n addressListBuilder.push(beginCell())\n }\n\n // Store the address in current builder\n addressListBuilder[addressListBuilder.length - 1].storeUint(addressToBigInt(addresses[idx]), 256)\n }\n\n // Build the cell chain from back to front\n let resultCell: Cell = addressListBuilder.pop()!.endCell()\n while (addressListBuilder.length > 0) {\n const head = addressListBuilder.pop()!\n resultCell = head.storeRef(resultCell).endCell()\n }\n\n return resultCell\n}\n\nexport function deserializeAddressList(cell: Cell): bigint[] {\n const addresses: bigint[] = []\n\n let currentCell: Cell | null = cell\n\n while (currentCell) {\n const slice = currentCell.beginParse()\n\n // Iterate through all the addresses in the current cell\n while (slice.remainingBits >= 256) {\n // Extract 256-bit address and add it to the addresses list\n addresses.push(slice.loadUintBig(256))\n }\n\n // Move to the next reference cell if available\n currentCell = slice.remainingRefs > 0 ? slice.loadRef() : null\n }\n\n return addresses\n}\n\nexport function serializePayees(payeesInfo: { address: AddressTypeLike; amount: NumberTypeLike }[]): Cell {\n const numPayees = payeesInfo.length\n\n if (numPayees === 0) {\n return emptyCell()\n }\n\n let linkedList = beginCell()\n let idx = 1\n\n while (idx <= numPayees) {\n const curPayee = payeesInfo[numPayees - idx]\n\n if (idx % 3 === 0) {\n linkedList = beginCell()\n .storeRef(linkedList.endCell())\n .storeUint(addressToBigInt(curPayee.address), 256)\n .storeUint(BigInt(curPayee.amount), 64)\n } else {\n linkedList = linkedList\n .storeUint(addressToBigInt(curPayee.address), 256)\n .storeUint(BigInt(curPayee.amount), 64)\n }\n\n idx += 1\n }\n\n return linkedList.endCell()\n}\n\nexport function deserializePayees(serializedPayees: Cell): { address: string; amount: bigint }[] {\n let payeesSlice = serializedPayees.beginParse()\n\n if (payeesSlice.remainingBits === 0) {\n return []\n }\n\n const payees: { address: string; amount: bigint }[] = []\n const payeeBits = 256 + 64\n\n while (payeesSlice.remainingBits >= payeeBits || payeesSlice.remainingRefs > 0) {\n if (payeesSlice.remainingBits >= payeeBits) {\n payees.push({\n address: addressToHex(payeesSlice.loadUintBig(256)),\n amount: payeesSlice.loadUintBig(64),\n })\n } else if (payeesSlice.remainingRefs > 0) {\n payeesSlice = payeesSlice.loadRef().beginParse()\n } else {\n break\n }\n }\n\n return payees\n}\n","import { Address, BitString, Cell, Dictionary, beginCell } from '@ton/core'\n\nimport { emptyCell } from './helpers'\nimport { addressToBigInt } from '../../../address-utils'\n\nexport const cl = {\n t: {\n uint1: 0,\n bool: 0, // same as uint1\n uint2: 1,\n uint4: 2,\n uint8: 3,\n uint16: 4,\n uint32: 5,\n uint64: 6,\n uint128: 7,\n coins: 7, // same as uint128\n uint256: 8,\n address: 8, // same as uint256\n cellRef: 9, // same as cellRef\n dict256: 9, // same as cellRef\n objRef: 9, // same as cellRef\n addressList: 9, // same as cellRef\n },\n NULL_CLASS_NAME: 'NULL',\n ERROR: {\n INVALID_CLASS: 'INVALID_CLASS',\n },\n} as const\n\nconst MAX_NAME_LEN = 10\nexport const NAME_WIDTH = 8 * MAX_NAME_LEN\n\nconst FIELD_TYPE_WIDTH = 4\nconst CELL_ID_WIDTH = 2\nconst DATA_OFFSET_WIDTH = 10\nconst REF_OFFSET_WIDTH = 2\nconst FIELD_INFO_WIDTH = FIELD_TYPE_WIDTH + CELL_ID_WIDTH + DATA_OFFSET_WIDTH + REF_OFFSET_WIDTH\nconst MAX_CLASS_FIELDS = 15\n\nconst BASIC_HEADER_WIDTH = NAME_WIDTH\nconst HEADER_WIDTH = BASIC_HEADER_WIDTH + MAX_CLASS_FIELDS * FIELD_INFO_WIDTH\nexport const MAX_CELL_BITS = 1023\nconst MAX_CELL_REFS = 4\n\nexport type ClassTypeLike = Cell\nexport type NumberTypeLike = string | bigint | number\nexport type BoolTypeLike = NumberTypeLike | boolean\nexport type AddressTypeLike = Address | string | bigint\nexport type AddressListTypeLike = AddressTypeLike[] | Cell\nexport type DecodedAndRaw<T, _Cell extends Cell = Cell> = T & {\n rawCell: _Cell\n}\nexport type DictionaryTypeLike<V> = Dictionary<bigint, V> | Cell | DecodedAndRaw<object>\n\nexport interface ClDeclareCellField {\n type: typeof cl.t.objRef\n value: Cell\n}\n\nexport interface ClDeclareNumericField {\n type: (typeof cl.t)[keyof Omit<typeof cl.t, 'objRef' | 'cellRef' | 'dict256'>]\n value: NumberTypeLike | BoolTypeLike | AddressTypeLike\n typeMetadata: keyof (typeof cl)['t']\n}\n\nexport type ClDeclareField = ClDeclareCellField | ClDeclareNumericField\n\n/**\n * Throws an error if value is smaller than -1\n */\nexport const numberTypeLikeToAbsBigInt = (\n val: NumberTypeLike | BoolTypeLike | AddressTypeLike,\n typeMetadata?: keyof (typeof cl)['t']\n): bigint => {\n if (val instanceof Address) {\n return addressToBigInt(val)\n }\n\n if (typeof val === 'string') {\n if (Address.isFriendly(val) || Address.isRaw(val)) {\n return addressToBigInt(Address.parse(val))\n }\n\n if (typeMetadata === 'address') {\n // Only try to convert the string as an address if the type of the field is marked as an address to avoid interpreting numbers as addresses\n try {\n // NOTE - Igor: this differs from the offchain monorepo impl\n return BigInt('0x0' + val.substring(2))\n } catch {\n // Not a known address type for other chains\n }\n }\n }\n\n const _val = BigInt(val)\n\n if (_val < -1n) {\n throw new Error('Invalid value. Only accepted negative value is -1')\n }\n\n return _val < 0 ? -_val : _val\n}\n\nexport const _getTypeWidth = (clType: (typeof cl.t)[keyof typeof cl.t]): number => {\n if (clType <= cl.t.uint256) {\n return 1 << clType\n }\n\n return 0\n}\n\nconst isNumericType = (field: ClDeclareField): field is ClDeclareNumericField => {\n // On TON classes all the fields are stored as a Cell or a uint and\n // and the types are ordered in a way that all the uints are lower than\n // the class values\n return field.type <= cl.t.uint256\n}\n\nconst isCellType = (field: ClDeclareField): field is ClDeclareCellField => {\n // For all the cells, the type is always the same number stored as cellRef\n // and all the other types that are cells map to the same number\n return field.type == cl.t.cellRef\n}\n\nexport const clDeclare = (name: bigint, fields: ClDeclareField[]): Cell => {\n if (fields.length > MAX_CLASS_FIELDS) {\n throw new Error(cl.ERROR.INVALID_CLASS)\n }\n\n const classBuilder = [null, beginCell()]\n\n let headerBuilder = beginCell().storeUint(name, NAME_WIDTH)\n\n let curDataCell = 1\n let curRefCell = 1\n let curCellMaxRefs = 2\n let curDataOffset = HEADER_WIDTH\n let curRefOffset = 0\n\n for (const field of fields) {\n const fieldBits = _getTypeWidth(field.type)\n\n if (curDataOffset + fieldBits > MAX_CELL_BITS) {\n curDataCell += 1\n curDataOffset = 0\n if (curDataCell >= classBuilder.length) {\n classBuilder.push(beginCell())\n }\n }\n if (fieldBits == 0) {\n if (curRefOffset + 1 > curCellMaxRefs) {\n curRefCell += 1\n curRefOffset = 0\n curCellMaxRefs = MAX_CELL_REFS\n if (curRefCell >= classBuilder.length) {\n classBuilder.push(beginCell())\n }\n }\n }\n\n if (isNumericType(field)) {\n classBuilder[curDataCell] = classBuilder[curDataCell]!.storeUint(\n numberTypeLikeToAbsBigInt(field.value, field.typeMetadata),\n fieldBits\n )\n } else if (isCellType(field)) {\n classBuilder[curRefCell] = classBuilder[curRefCell]!.storeRef(field.value)\n } else {\n throw new Error(cl.ERROR.INVALID_CLASS)\n }\n\n headerBuilder = headerBuilder.storeUint(field.type, FIELD_TYPE_WIDTH)\n if (fieldBits > 0) {\n headerBuilder = headerBuilder\n .storeUint(curDataCell == 1 ? 0 : curDataCell, CELL_ID_WIDTH)\n .storeUint(curDataOffset, DATA_OFFSET_WIDTH)\n .storeUint(3, REF_OFFSET_WIDTH)\n curDataOffset += fieldBits\n } else {\n headerBuilder = headerBuilder\n .storeUint(curRefCell == 1 ? 0 : curRefCell, CELL_ID_WIDTH)\n .storeUint(MAX_CELL_BITS, DATA_OFFSET_WIDTH)\n .storeUint(curRefOffset, REF_OFFSET_WIDTH)\n curRefOffset += 1\n }\n }\n\n let rootBuilder = classBuilder[1]!\n const numCells = classBuilder.length - 1\n\n if (numCells > 1) {\n if (rootBuilder.refs == 0) {\n rootBuilder = rootBuilder.storeRef(emptyCell()).storeRef(emptyCell())\n } else if (rootBuilder.refs == 1) {\n rootBuilder = rootBuilder.storeRef(emptyCell())\n }\n }\n\n const trailingOnes = HEADER_WIDTH - headerBuilder.bits\n\n headerBuilder = headerBuilder\n .storeBits(new BitString(Buffer.from('F'.repeat(trailingOnes), 'hex'), 0, trailingOnes))\n .storeBuilder(rootBuilder)\n\n if (numCells == 1) {\n return headerBuilder.endCell()\n }\n\n if (numCells == 2) {\n return headerBuilder.storeRef(classBuilder[2]!.endCell()).endCell()\n }\n\n return headerBuilder.storeRef(classBuilder[2]!.endCell()).storeRef(classBuilder[3]!.endCell()).endCell()\n}\n\nconst loadFieldInfo = (\n cell: Cell,\n fieldName: number\n): { fieldCellIndex: number; fieldOffset: number; fieldRefIdx: number } => {\n const headerSlice = cell.beginParse()\n const fieldInfoOffset = BASIC_HEADER_WIDTH + fieldName * FIELD_INFO_WIDTH\n headerSlice.skip(fieldInfoOffset + FIELD_TYPE_WIDTH)\n const fieldCellIndex = headerSlice.loadUint(CELL_ID_WIDTH)\n const fieldOffset = headerSlice.loadUint(DATA_OFFSET_WIDTH)\n const fieldRefIdx = headerSlice.loadUint(REF_OFFSET_WIDTH)\n return { fieldCellIndex, fieldOffset, fieldRefIdx }\n}\n\nexport const clGetUint = (cell: Cell, fieldName: number, width: number): bigint => {\n const headerSlice = cell.beginParse()\n const { fieldCellIndex, fieldOffset } = loadFieldInfo(cell, fieldName)\n\n if (fieldCellIndex == 0) {\n return headerSlice.skip(fieldOffset).loadUintBig(width)\n }\n\n for (let i = 0; i < fieldCellIndex; i++) {\n headerSlice.loadRef()\n }\n\n return headerSlice.loadRef().beginParse().skip(fieldOffset).loadUintBig(width)\n}\n\nexport const clGetCellRef = (cell: Cell, fieldName: number): Cell => {\n const headerSlice = cell.beginParse()\n const { fieldCellIndex, fieldRefIdx } = loadFieldInfo(cell, fieldName)\n\n if (fieldCellIndex == 0) {\n for (let i = 0; i < fieldRefIdx; i++) {\n headerSlice.loadRef()\n }\n\n return headerSlice.loadRef()\n }\n\n for (let i = 0; i < fieldCellIndex; i++) {\n headerSlice.loadRef()\n }\n\n const cellRef = headerSlice.loadRef().beginParse()\n\n for (let i = 0; i < fieldRefIdx; i++) {\n cellRef.loadRef()\n }\n\n return cellRef.loadRef()\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-return */\n\nimport { Address, Cell } from '@ton/core'\n\nimport { getCellName } from './class'\nimport { addressToHex } from '../../address-utils'\n\ntype Primitive = string | number | bigint | any[] | boolean | object\n\n/**\n * Recursively traverses a TON cell, deciding how to decode each node based on\n * the class names stored in the cell.\n * @param cell the root cell to begin decoding from.\n * @param hashUndecodeable if TRUE, cells that can't be decoded will be hashed. if FALSE, they will be returned unchanged.\n * This does not apply to primitive values.\n * @returns an object whose fields are each the fields of the decoded cell, and whose (cell) fields are themselves decoded.\n */\nexport const deepDecode = <\n Recurse extends { [key: string]: Recurse },\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cell: Cell | Primitive,\n hashUndecodeable?: boolean\n): any => {\n if (!(cell instanceof Cell)) {\n //\"cell\" is a primitive, or otherwise can't be decoded as it is not a TON cell\n return cell\n }\n\n try {\n const decoded = decodeClass(getCellName(cell) as ClassName, cell)\n return Object.fromEntries(\n //cell was decoded successfully, recurse\n Object.entries(decoded).map(([k, v]) => [\n k,\n deepDecode<Recurse, ClassName, DecodeClass>(decodeClass, v, hashUndecodeable),\n ])\n )\n } catch (e) {\n //could not decode cell, probably because it has no class name. either hash it, or return it\n return hashUndecodeable === true ? cell.hash().toString('hex') : cell\n }\n}\n\nexport const printDeepDecode = <\n Recurse extends { [key: string]: Recurse },\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cell: Cell | Primitive\n): void => {\n console.log(\n JSON.stringify(\n deepDecode<Recurse, ClassName, DecodeClass>(decodeClass, cell, true),\n (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString()\n }\n\n if (v instanceof Address) {\n return addressToHex(v)\n }\n\n return v\n },\n 2\n )\n )\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return */\n\nimport { Cell } from '@ton/core'\n\nimport { deepDecode } from './deepDecodeCell'\n\nconst diffRecurse = (\n cellA: { [key: string]: any },\n cellB: { [key: string]: any },\n ancestry: string[]\n): { a: any; b: any; ancestry: string[] }[] => {\n if (cellA === cellB) {\n return []\n }\n if (typeof cellA !== 'object' || typeof cellB !== 'object') {\n return [{ a: cellA, b: cellB, ancestry }]\n }\n const cellAKeysSet = new Set(Object.keys(cellA))\n return [\n ...Object.keys(cellA).map((cellAKey) =>\n diffRecurse(cellA[cellAKey], cellB[cellAKey], ancestry.concat(cellAKey))\n ),\n ...Object.keys(cellB)\n .filter((k) => !cellAKeysSet.has(k))\n .map((cellBKey) => {\n return diffRecurse(cellA[cellBKey], cellB[cellBKey], ancestry.concat(cellBKey))\n }),\n ].flat()\n}\n\n/**\n * Deeply compare two TON cells.\n * @param cellA\n * @param cellB\n * @returns an object with a list of all values that differ between the two cells. Each inequal value is {a, b, ancestry},\n * where a and b are the values of cellA and cellB respectively, and ancestry is an array [p_0 ... p_n] s.t. p_i is the name\n * of the field accessed at both cellA and cellB _i_ deep.\n * This function returns _every_ difference between the two cells, except in the case where,\n * e.g., cellA = {subObject: 'hello world'}, cellB = {sub: {a, b, c: {x, y, z}}}--inequalValues = {a: 'hello world', b: [Object object], ancestry: ['Cell', 'subObject'].\n * I.e., it is unable to detect sub-failures after ancestry diverges.\n */\nexport const deepDiff = <\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cellA: Cell,\n cellB: Cell\n): {\n isEqual: boolean\n inequalValues: { a: any; b: any; ancestry: string[] }[]\n} => {\n const decodedA = deepDecode<{ [key: string]: any }, ClassName, DecodeClass>(decodeClass, cellA, true)\n const decodedB = deepDecode<{ [key: string]: any }, ClassName, DecodeClass>(decodeClass, cellB, true)\n const recursed = diffRecurse(decodedA, decodedB, ['diff_root'])\n return { isEqual: recursed.length === 0, inequalValues: recursed }\n}\n\nexport const printDeepDiff = <\n ClassName extends 'POOO',\n DecodeClass extends (name: ClassName, cell: Cell) => { [key: string]: any },\n>(\n decodeClass: DecodeClass,\n cellA: Cell,\n cellB: Cell\n): void => {\n console.log(\n JSON.stringify(\n deepDiff<ClassName, DecodeClass>(decodeClass, cellA, cellB),\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\n 2\n )\n )\n}\n","import { Cell, beginCell } from '@ton/core'\n\nimport { ClasslibWrapper } from './ClasslibWrapper'\nimport { ExtendedContract } from './base-wrapper'\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<ClasslibWrapper>): Promise<Cell> {\n return wrapper.getDictCellItem(this._cell, key)\n }\n\n async getBigInt(key: bigint, wrapper: ExtendedContract<ClasslibWrapper>): Promise<bigint> {\n return wrapper.getDictUint256Item(this._cell, key)\n }\n\n async set(key: bigint, value: Cell, wrapper: ExtendedContract<ClasslibWrapper>): 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 async function getLzDict(\n obj: Cell,\n fieldName: bigint,\n wrapper: ExtendedContract<ClasslibWrapper>\n): Promise<LzDict> {\n const dictCell = await wrapper.getClDict(obj, fieldName)\n return new LzDict(dictCell)\n}\n"]}
|