@layerzerolabs/ton-sdk-tools 3.0.76 → 3.0.78

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/sdk-tools.ts","../src/base-wrapper.ts","../src/test-tools.ts","../src/externalWrappers/Multisig-Constants.ts","../src/externalWrappers/Multisig.ts","../src/externalWrappers/Order.ts","../src/externalWrappers/multisig-utils.ts","../src/externalWrappers/jetton-helpers.ts","../src/externalWrappers/jetton-minter.ts","../src/externalWrappers/jetton-wallet.ts","../src/print-tx-trace.ts"],"names":["Cell","crc32","Address","toBigIntBE","toBufferBE","str","fs","path","name","SendMode","beginCell","Dictionary","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3"],"mappings":"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AA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;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;AAmkDlB,EAAAJ,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,WAAmB,QAAwB,EAAA;AAC5E,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAwWlB,EAAAD,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,oBAAA,CAAqB,WAAmB,QAAwB,EAAA;AAC5E,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;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;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;AAorElB,EAAAD,sBAAG,aAAcC,CAAAA,uBAAAA,CAAK,KAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;;;AC5mIO,IAAe,kBAAf,MAA+B;AAiBtC;AAjBsB,eAAA,CACF,QAAW,GAAA;AAAA,EACvB,SAAW,EAAA,UAAA;AAAA,EACX,OAAS,EAAA,UAAA;AAAA,EACT,gBAAkB,EAAA;AACtB,CAAA;AALkB,eAAA,CAMF,KAAQ,GAAA;AAAA,EACpB,OAAS,EAAA,UAAA;AAAA,EACT,OAAS,EAAA,CAAA;AAAA,EACT,gBAAkB,EAAA,UAAA;AAAA,EAClB,QAAU,EAAA,UAAA;AAAA,EACV,IAAM,EAAA;AACV,CAAA;AAZkB,eAAA,CAaF,OAAU,GAAA;AAAA,EACtB,YAAc,EAAA,UAAA;AAAA,EACd,sBAAwB,EAAA;AAC5B,CAAA;AAGG,IAAe,iBAAf,MAA8B;AAmBrC;AAnBsB,cAAA,CACF,QAAW,GAAA;AAAA,EACvB,sBAAwB,EAAA,IAAA;AAAA,EACxB,iBAAmB,EAAA,IAAA;AAAA,EACnB,cAAgB,EAAA,GAAA;AAAA,EAChB,oBAAsB,EAAA,GAAA;AAAA,EACtB,gBAAkB,EAAA,GAAA;AAAA,EAClB,2BAA6B,EAAA,GAAA;AAAA,EAC7B,OAAS,EAAA;AACb,CAAA;AATkB,cAAA,CAUF,KAAQ,GAAA;AAAA,EACpB,iBAAmB,EAAA,GAAA;AAAA,EACnB,gBAAkB,EAAA,GAAA;AAAA,EAClB,cAAgB,EAAA,GAAA;AAAA,EAChB,iBAAmB,EAAA,GAAA;AAAA,EACnB,OAAS,EAAA,GAAA;AAAA,EACT,UAAY,EAAA,KAAA;AAAA,EACZ,gBAAkB,EAAA;AACtB,CAAA;AAGG,IAAe,iBAAf,MAA8B;AASrC;AATsB,cAAA,CACF,OAAU,GAAA;AAAA,EACtB,EAAI,EAAA,EAAA;AAAA,EACJ,OAAS,EAAA,EAAA;AAAA,EACT,UAAY,EAAA,GAAA;AAAA,EACZ,WAAa,EAAA,CAAA;AAAA,EACb,WAAa,EAAA,CAAA;AAAA,EACb,IAAM,EAAA;AACV,CAAA;ACEJ,SAAS,YAAY,GAA6C,EAAA;AAC9D,EAAM,MAAA,IAAA,GAAOI,eAAW,CAAA,KAAA,CAAMA,eAAW,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAG,EAAAA,eAAA,CAAW,MAAO,CAAA,OAAA,EAAS,CAAA;AAClF,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AACjC,IAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAI,CAAA,CAAC,CAAC,CAAA;AAAA;AAEtB,EAAO,OAAA,IAAA;AACX;AAEA,SAAS,YAAY,QAAkC,EAAA;AACnD,EAAA,IAAI,SAAoB,EAAC;AACzB,EAAA,IAAI,aAAa,IAAM,EAAA;AACnB,IAAA,MAAM,IAAO,GAAAA,eAAA,CAAW,UAAW,CAAAA,eAAA,CAAW,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,EAAGA,eAAW,CAAA,MAAA,CAAO,OAAQ,EAAA,EAAG,QAAQ,CAAA;AACjG,IAAA,MAAA,GAAS,KAAK,MAAO,EAAA;AAAA;AAEzB,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,qBAAqB,MAA8B,EAAA;AAC/D,EAAA,OAAOD,gBACF,CAAA,SAAA,CAAU,GAAG,cAAe,CAAA,OAAA,CAAQ,UAAU,CAC9C,CAAA,SAAA,CAAU,OAAO,SAAW,EAAA,cAAA,CAAe,QAAQ,WAAW,CAAA,CAC9D,SAASA,cAAU,EAAA,CAAE,gBAAgB,WAAY,CAAA,MAAA,CAAO,OAAO,CAAC,CAAC,EACjE,SAAU,CAAA,MAAA,CAAO,QAAQ,MAAQ,EAAA,cAAA,CAAe,QAAQ,WAAW,CAAA,CACnE,UAAU,WAAY,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CACvC,SAAS,MAAO,CAAA,mBAAmB,EACnC,OAAQ,EAAA;AACjB;AAEa,IAAA,QAAA,GAAN,MAAM,SAA6B,CAAA;AAAA,EAGtC,WAAA,CACa,OACA,EAAA,IAAA,EACA,aACX,EAAA;AAHW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAET,IAAA,IAAA,CAAK,UAAa,GAAA,CAAA;AAAA;AACtB,EAEA,OAAO,kBAAkB,OAA4B,EAAA;AACjD,IAAM,MAAA,QAAA,GAAW,IAAI,SAAA,CAAS,OAAO,CAAA;AACrC,IAAA,QAAA,CAAS,UAAa,GAAA,CAAA;AACtB,IAAO,OAAA,QAAA;AAAA;AACX,EAEA,OAAO,gBAAA,CAAiB,MAAwB,EAAA,IAAA,EAAY,YAAY,CAAa,EAAA;AACjF,IAAM,MAAA,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,IAAM,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,IAAK,EAAA;AAC1B,IAAA,OAAO,IAAI,SAAS,CAAAE,oBAAA,CAAgB,WAAW,IAAI,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA;AACtE,EAEA,MAAM,UAAA,CAAW,QAA4B,EAAA,GAAA,EAAa,KAA8B,EAAA;AACpF,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUH,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAMC,EAAAA,cAAAA,EACD,CAAA,SAAA,CAAU,GAAG,cAAe,CAAA,OAAA,CAAQ,EAAE,CAAA,CACtC,UAAU,CAAG,EAAA,cAAA,CAAe,OAAQ,CAAA,OAAO,EAC3C,OAAQ;AAAA,KAChB,CAAA;AAAA;AACL,EAEA,OAAO,oBAAoB,QAAiC,EAAA;AACxD,IAAA,OAAOA,gBACF,CAAA,SAAA,CAAU,gBAAgB,OAAQ,CAAA,YAAA,EAAc,eAAe,OAAQ,CAAA,EAAE,EACzE,SAAU,CAAA,QAAA,CAAS,UAAU,CAAC,CAAA,CAC9B,SAAS,QAAS,CAAA,OAAO,EACzB,OAAQ,EAAA;AAAA;AACjB,EAEA,OAAO,kBAAkB,MAA6B,EAAA;AAClD,IAAA,OAAOA,cAAU,EAAA,CACZ,SAAU,CAAA,eAAA,CAAgB,QAAQ,sBAAwB,EAAA,cAAA,CAAe,OAAQ,CAAA,EAAE,CACnF,CAAA,SAAA,CAAU,MAAO,CAAA,SAAA,EAAW,eAAe,OAAQ,CAAA,WAAW,CAC9D,CAAA,QAAA,CAASA,cAAU,EAAA,CAAE,eAAgB,CAAA,WAAA,CAAY,OAAO,OAAO,CAAC,CAAC,CAAA,CACjE,UAAU,WAAY,CAAA,MAAA,CAAO,SAAS,CAAC,EACvC,OAAQ,EAAA;AAAA;AACjB,EAEA,OAAO,UAAU,OAAyB,EAAA;AACtC,IAAM,MAAA,UAAA,GAAaC,eAAW,CAAA,KAAA,CAAMA,eAAW,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAG,EAAAA,eAAA,CAAW,MAAO,CAAA,IAAA,EAAM,CAAA;AACrF,IAAI,IAAA,OAAA,CAAQ,SAAS,GAAK,EAAA;AACtB,MAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA;AAAA,KAChE,MAAA;AAEH,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CAAK,EAAA,EAAA;AACrC,QAAM,MAAA,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAM,MAAA,UAAA,GACF,MAAO,CAAA,IAAA,KAAS,UACV,GAAA,SAAA,CAAS,oBAAoB,MAAM,CAAA,GACnC,SAAS,CAAA,iBAAA,CAAkB,MAAM,CAAA;AAC3C,QAAW,UAAA,CAAA,GAAA,CAAI,GAAG,UAAU,CAAA;AAAA;AAEhC,MAAA,OAAOD,cAAU,EAAA,CAAE,eAAgB,CAAA,UAAU,EAAE,OAAQ,EAAA;AAAA;AAC3D;AACJ,EAEA,OAAO,gBACH,OACA,EAAA,cAAA,EACA,UACA,OACA,EAAA,QAAA,GAAW,+EACX,EAAA,QAAA,GAA4B,CACxB,EAAA;AACJ,IAAA,MAAM,UAAUA,cAAU,EAAA,CACrB,SAAU,CAAA,eAAA,CAAgB,SAAS,SAAW,EAAA,cAAA,CAAe,OAAQ,CAAA,EAAE,EACvE,SAAU,CAAA,QAAA,EAAU,cAAe,CAAA,OAAA,CAAQ,OAAO,CAClD,CAAA,SAAA,CAAU,QAAU,EAAA,cAAA,CAAe,QAAQ,UAAU,CAAA,CACrD,QAAS,CAAA,QAAQ,EACjB,SAAU,CAAA,OAAA,EAAS,cAAe,CAAA,OAAA,CAAQ,WAAW,CACrD,CAAA,SAAA,CAAU,cAAgB,EAAA,cAAA,CAAe,QAAQ,IAAI,CAAA;AAE1D,IAAA,IAAI,mBAAmBV,SAAM,EAAA;AACzB,MAAA,OAAO,OAAQ,CAAA,QAAA,CAAS,OAAO,CAAA,CAAE,OAAQ,EAAA;AAAA;AAG7C,IAAI,IAAA,OAAA,CAAQ,UAAU,CAAG,EAAA;AACrB,MAAM,MAAA,IAAI,MAAM,4BAA4B,CAAA;AAAA;AAEhD,IAAM,MAAA,UAAA,GAAa,SAAS,CAAA,SAAA,CAAU,OAAO,CAAA;AAC7C,IAAA,OAAO,OAAQ,CAAA,QAAA,CAAS,UAAU,CAAA,CAAE,OAAQ,EAAA;AAAA;AAChD,EAEA,MAAM,YAAA,CACF,QACA,EAAA,GAAA,EACA,OACA,EAAA,cAAA,EACA,KAAgB,GAAAa,WAAA,CAAO,GAAG,CAAA,EAC1B,OACA,EAAA,QAAA,EACA,KACa,EAAA;AACb,IAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACpB,MAAQ,KAAA,GAAA,+EAAA;AAAA;AAEZ,IAAI,IAAA,IAAA,CAAK,kBAAkB,KAAW,CAAA,EAAA;AAClC,MAAM,MAAA,IAAI,MAAM,qEAAqE,CAAA;AAAA;AAIzF,IAAI,IAAA,GAAA,CAAI,YAAY,KAAW,CAAA,EAAA;AAC3B,MAAA,MAAM,UAAU,CAAC,CAAA,KAAwB,CAAE,CAAA,MAAA,CAAO,IAAI,OAAQ,CAAA;AAC9D,MAAA,OAAA,GAAU,IAAK,CAAA,aAAA,CAAc,OAAQ,CAAA,SAAA,CAAU,OAAO,CAAA;AACtD,MAAA,IAAI,WAAW,CAAG,EAAA;AACd,QAAW,QAAA,GAAA,IAAA;AAAA,OACR,MAAA;AACH,QAAA,OAAA,GAAU,IAAK,CAAA,aAAA,CAAc,SAAU,CAAA,SAAA,CAAU,OAAO,CAAA;AACxD,QAAA,IAAI,UAAU,CAAG,EAAA;AACb,UAAM,MAAA,IAAI,MAAM,oCAAoC,CAAA;AAAA;AAExD,QAAW,QAAA,GAAA,KAAA;AAAA;AACf,KACO,MAAA,IAAA,QAAA,KAAa,KAAa,CAAA,IAAA,OAAA,IAAW,KAAW,CAAA,EAAA;AACvD,MAAM,MAAA,IAAI,MAAM,yEAAyE,CAAA;AAAA;AAG7F,IAAI,IAAA,UAAA;AAEJ,IAAA,IAAI,mBAAmBb,SAAM,EAAA;AACzB,MAAa,UAAA,GAAA,OAAA;AAAA,KACV,MAAA;AACH,MAAa,UAAA,GAAA,SAAA,CAAS,UAAU,OAAO,CAAA;AAAA;AAE3C,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUS,aAAS,CAAA,kBAAA;AAAA,MACnB,KAAA;AAAA,MACA,MAAM,SAAS,CAAA,eAAA,CAAgB,YAAY,cAAgB,EAAA,QAAA,EAAU,SAAS,KAAK;AAAA,KACtF,CAAA;AAAA;AAEL,EAEA,MAAM,eAAgB,CAAA,QAAA,EAA4B,UAAsC,EAAA;AACpF,IAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,SAAS,GAAI,CAAA,mBAAA,EAAqB,CAAC,EAAE,IAAM,EAAA,KAAA,EAAO,KAAO,EAAA,UAAA,EAAY,CAAC,CAAA;AAC9F,IAAA,OAAO,MAAM,WAAY,EAAA;AAAA;AAC7B,EAEA,MAAM,gBAAA,CAAiB,QAA4B,EAAA,KAAA,EAAc,eAA0C,EAAA;AACvG,IAAM,MAAA,SAAA,GAAY,SAAS,CAAA,SAAA,CAAU,KAAK,CAAA;AAC1C,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAM,QAAA,CAAS,IAAI,oBAAsB,EAAA;AAAA,MACvD,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,MAChC,EAAE,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,eAAgB;AAAA,KACzC,CAAA;AACD,IAAA,OAAO,MAAM,aAAc,EAAA;AAAA;AAC/B,EAEA,MAAM,gBAAgB,QAAmD,EAAA;AACrE,IAAM,MAAA,EAAE,OAAU,GAAA,MAAM,SAAS,GAAI,CAAA,mBAAA,EAAqB,EAAE,CAAA;AAC5D,IAAM,MAAA,cAAA,GAAiB,MAAM,aAAc,EAAA;AAC3C,IAAM,MAAA,SAAA,GAAY,MAAM,aAAc,EAAA;AACtC,IAAA,MAAM,OAAU,GAAA,WAAA,CAAY,KAAM,CAAA,WAAA,EAAa,CAAA;AAC/C,IAAA,MAAM,SAAY,GAAA,WAAA,CAAY,KAAM,CAAA,WAAA,EAAa,CAAA;AACjD,IAAA,OAAO,EAAE,cAAA,EAAgB,SAAW,EAAA,OAAA,EAAS,SAAU,EAAA;AAAA;AAE/D;ACnNA,SAASK,aAAY,GAA6C,EAAA;AAC9D,EAAM,MAAA,IAAA,GAAOH,eAAW,CAAA,KAAA,CAAMA,eAAW,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAGA,EAAAA,eAAAA,CAAW,MAAO,CAAA,OAAA,EAAS,CAAA;AAClF,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AACjC,IAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAI,CAAA,CAAC,CAAC,CAAA;AAAA;AAEtB,EAAO,OAAA,IAAA;AACX;AAEA,SAASI,aAAY,QAAkC,EAAA;AACnD,EAAA,IAAI,SAAoB,EAAC;AACzB,EAAA,IAAI,aAAa,IAAM,EAAA;AACnB,IAAA,MAAM,IAAOJ,GAAAA,eAAAA,CAAW,UAAWA,CAAAA,eAAAA,CAAW,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,EAAGA,eAAW,CAAA,MAAA,CAAO,OAAQ,EAAA,EAAG,QAAQ,CAAA;AACjG,IAAA,MAAA,GAAS,KAAK,MAAO,EAAA;AAAA;AAEzB,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,kBAAkB,MAA+B,EAAA;AAC7D,EAAA,OAAOD,cAAU,EAAA,CACZ,YAAa,CAAA,MAAA,CAAO,QAAQ,CAAA,CAC5B,SAAU,CAAA,MAAA,CAAO,UAAY,EAAA,cAAA,CAAe,OAAQ,CAAA,UAAU,EAC9D,OAAQ,EAAA;AACjB;AAEa,IAAA,KAAA,GAAN,MAAM,MAA0B,CAAA;AAAA,EACnC,WAAA,CACa,OACA,EAAA,IAAA,EACA,aACX,EAAA;AAHW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA;AACV,EAEH,OAAO,kBAAkB,OAAyB,EAAA;AAC9C,IAAO,OAAA,IAAI,OAAM,OAAO,CAAA;AAAA;AAC5B,EAEA,OAAO,gBAAA,CAAiB,MAAyB,EAAA,IAAA,EAAY,YAAY,CAAU,EAAA;AAC/E,IAAM,MAAA,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,IAAM,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,IAAK,EAAA;AAE1B,IAAA,OAAO,IAAI,MAAME,CAAAA,oBAAAA,CAAgB,WAAW,IAAI,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA;AACnE,EAEA,OAAO,WAAA,CACH,OACA,EAAA,eAAA,EACA,KACA,EAAA,SAAA,GAAY,CACZ,EAAA,eAAA,GAAkB,KAClB,EAAA,UAAA,GAAa,CACb,EAAA,QAAA,GAA4B,CACxB,EAAA;AACJ,IAAA,MAAM,UAAUF,cAAU,EAAA,CACrB,UAAU,eAAgB,CAAA,KAAA,CAAM,MAAM,cAAe,CAAA,OAAA,CAAQ,EAAE,CAC/D,CAAA,SAAA,CAAU,UAAU,cAAe,CAAA,OAAA,CAAQ,OAAO,CAClD,CAAA,SAAA,CAAU,WAAW,cAAe,CAAA,OAAA,CAAQ,WAAW,CAAA,CACvD,SAASA,cAAU,EAAA,CAAE,gBAAgBI,YAAY,CAAA,OAAO,CAAC,CAAC,CAAA,CAC1D,UAAU,eAAiB,EAAA,cAAA,CAAe,QAAQ,IAAI,CAAA,CACtD,SAAS,KAAK,CAAA,CACd,SAAS,eAAe,CAAA;AAE7B,IAAA,IAAI,eAAiB,EAAA;AACjB,MAAA,OAAA,CAAQ,SAAU,CAAA,UAAA,EAAY,cAAe,CAAA,OAAA,CAAQ,WAAW,CAAA;AAAA;AAGpE,IAAA,OAAO,QAAQ,OAAQ,EAAA;AAAA;AAC3B,EAEA,MAAM,UAAA,CACF,QACA,EAAA,GAAA,EACA,OACA,OACA,EAAA,eAAA,EACA,KACA,EAAA,SAAA,GAAY,GACZ,eAAkB,GAAA,KAAA,EAClB,UAAa,GAAA,CAAA,EACb,WAA4B,CACf,EAAA;AACb,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUL,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAM,OAAM,WAAY,CAAA,OAAA,EAAS,iBAAiB,KAAO,EAAA,SAAA,EAAW,eAAiB,EAAA,UAAA,EAAY,QAAQ;AAAA,KAC5G,CAAA;AAAA;AACL,EAEA,MAAM,WACF,CAAA,QAAA,EACA,GACA,EAAA,UAAA,EACA,QAAgBI,WAAO,CAAA,GAAG,CAC1B,EAAA,QAAA,GAA4B,CACf,EAAA;AACb,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUJ,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAMC,gBACD,CAAA,SAAA,CAAU,gBAAgB,KAAM,CAAA,OAAA,EAAS,cAAe,CAAA,OAAA,CAAQ,EAAE,CAAA,CAClE,UAAU,QAAU,EAAA,cAAA,CAAe,OAAQ,CAAA,OAAO,CAClD,CAAA,SAAA,CAAU,YAAY,cAAe,CAAA,OAAA,CAAQ,WAAW,CAAA,CACxD,OAAQ;AAAA,KAChB,CAAA;AAAA;AACL,EAEA,MAAM,aAAa,QAAsD,EAAA;AAOrE,IAAM,MAAA,EAAE,OAAU,GAAA,MAAM,SAAS,GAAI,CAAA,gBAAA,EAAkB,EAAE,CAAA;AACzD,IAAM,MAAA,QAAA,GAAW,MAAM,WAAY,EAAA;AACnC,IAAM,MAAA,WAAA,GAAc,MAAM,aAAc,EAAA;AACxC,IAAM,MAAA,SAAA,GAAY,MAAM,aAAc,EAAA;AACtC,IAAM,MAAA,QAAA,GAAW,MAAM,cAAe,EAAA;AACtC,IAAA,MAAM,OAAUK,GAAAA,YAAAA,CAAY,KAAM,CAAA,WAAA,EAAa,CAAA;AAC/C,IAAM,MAAA,SAAA,GAAY,MAAM,gBAAiB,EAAA;AACzC,IAAM,MAAA,aAAA,GAAgB,MAAM,aAAc,EAAA;AAC1C,IAAM,MAAA,eAAA,GAAkB,MAAM,gBAAiB,EAAA;AAC/C,IAAM,MAAA,KAAA,GAAQ,MAAM,WAAY,EAAA;AAChC,IAAI,IAAA,cAAA;AACJ,IAAA,IAAI,cAAc,IAAM,EAAA;AACpB,MAAiB,cAAA,GAAA,IAAI,MAAe,GAAG,CAAA;AACvC,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC1B,QAAA,cAAA,CAAe,CAAC,CAAI,GAAA,OAAA,CAAS,MAAM,MAAO,CAAA,CAAC,IAAK,SAAS,CAAA;AAAA;AAC7D,KACG,MAAA;AACH,MAAA,cAAA,GAAiB,EAAC;AAAA;AAGtB,IAAO,OAAA;AAAA,MACH,QAAQ,SAAc,KAAA,IAAA;AAAA,MACtB,QAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAW,EAAA,cAAA;AAAA,MACX,aAAA;AAAA,MACA,UAAY,EAAA,SAAA;AAAA,MACZ,eAAA;AAAA,MACA;AAAA,KACJ;AAAA;AAER;AC9Ka,IAAA,gBAAA,GAAmB,CAAC,OAA8B,KAAA;AAC3D,EAAI,IAAA,OAAA;AAEJ,EAAG,GAAA;AACC,IAAU,OAAA,GAAAC,uBAAA,CAAc,QAAQ,SAAS,CAAA;AAAA,GAC7C,QAAS,OAAQ,CAAA,MAAA,CAAO,OAAO,CAAA;AAE/B,EAAO,OAAA,OAAA;AACX;AAEa,IAAA,SAAA,GAAY,CAAC,GAAA,EAAa,GAAwB,KAAA;AAC3D,EAAA,OAAO,IAAK,CAAA,MAAA,EAAY,IAAA,GAAA,GAAM,GAAO,CAAA,GAAA,GAAA;AACzC;AAEa,IAAA,YAAA,GAAe,CAAC,GAAA,EAAa,GAAwB,KAAA;AAC9D,EAAA,OAAO,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,GAAA,EAAK,GAAG,CAAC,CAAA;AACzC;AAEa,IAAA,eAAA,GAAkB,CAAwB,GAAA,EAAU,KAAoD,KAAA;AACjH,EAAO,OAAA,GAAA,CAAI,KAAK,CAAC,CAAA,KAAMC,6BAAmBC,4BAAmB,CAAA,CAAC,CAAG,EAAA,KAAK,CAAC,CAAA;AAC3E;AAEa,IAAA,YAAA,GAAe,CACxB,SAAA,EACA,SAQC,KAAA;AACD,EAAA,MAAM,MAAS,GAAA,SAAA,CAAU,UAAW,EAAA,CAAE,cAAeP,CAAAA,eAAAA,CAAW,IAAK,CAAA,GAAA,CAAI,EAAE,CAAA,EAAGA,eAAW,CAAA,MAAA,CAAO,MAAM,CAAA;AAEtG,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,GAAI,CAAA,EAAA,GAAK,SAAS,CAAA;AAExC,EAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACtB,IAAA,MAAM,MAAM,6BAA6B,CAAA;AAAA;AAG7C,EAAM,MAAA,EAAA,GAAK,OAAO,UAAW,EAAA;AAC7B,EAAM,MAAA,KAAA,GAAQ,EAAG,CAAA,QAAA,CAAS,CAAC,CAAA;AAE3B,EAAA,IAAI,SAAS,GAAM,EAAA;AACf,IAAA,MAAM,MAAM,sCAAsC,CAAA;AAAA;AAEtD,EAAO,OAAA;AAAA,IACH,SAAA,EAAW,EAAG,CAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAC5B,QAAA,EAAU,EAAG,CAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAC3B,SAAA,EAAW,EAAG,CAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAC5B,cAAA,EAAgB,EAAG,CAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IACjC,SAAA,EAAW,EAAG,CAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAC5B,QAAA,EAAU,EAAG,CAAA,WAAA,CAAY,EAAE;AAAA,GAC/B;AACJ;AAEa,IAAA,gBAAA,GAAmB,CAAC,KAA+B,KAAA;AAC5D,EAAA,IAAI,MAAM,WAAY,CAAA,IAAA,KAAS,WAAiB,MAAA,IAAI,MAAM,8BAA8B,CAAA;AACxF,EAAA,OAAO,MAAM,WAAY,CAAA,YAAA,GAAe,KAAM,CAAA,WAAA,CAAY,aAAa,oBAAuB,GAAA,EAAA;AAClG;AACa,IAAA,eAAA,GAAkB,CAAC,KAA6C,KAAA;AACzE,EAAA,IAAI,MAAM,WAAY,CAAA,IAAA,KAAS,WAAiB,MAAA,IAAI,MAAM,8BAA8B,CAAA;AACxF,EAAI,IAAA,KAAA,CAAM,YAAY,YAAa,CAAA,IAAA,KAAS,MAAY,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAC1F,EAAA,OAAO,MAAM,WAAY,CAAA,YAAA;AAC7B;AAOO,IAAM,aAAN,MAAiE;AAAA,EAIpE,WAAA,CAAY,IAAgB,GAAc,EAAA;AACtC,IAAA,IAAA,CAAK,QAAW,GAAA,CAAC,EAAE,GAAA,EAAK,CAAA;AACxB,IAAA,IAAA,CAAK,UAAa,GAAA,EAAA;AAAA;AACtB,EAEA,MAAa,IAAuD,GAAA;AAChE,IAAI,IAAA,IAAA,CAAK,QAAS,CAAA,MAAA,IAAU,CAAG,EAAA;AAC3B,MAAA,OAAO,EAAE,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,KAAU,CAAA,EAAA;AAAA;AAE1C,IAAM,MAAA,MAAA,GAAgC,IAAK,CAAA,QAAA,CAAS,KAAM,EAAA;AAC1D,IAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACtB,MAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAE5C,IAAA,MAAM,QAAQ,MAAO,CAAA,GAAA;AACrB,IAAA,IAAI,MAAM,IAAK,CAAA,IAAA,KAAS,YAAkB,MAAA,IAAI,MAAM,eAAe,CAAA;AACnE,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,WAAW,WAAY,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAC7D,IAAM,MAAA,GAAA,GAAM,MAAM,GAAA,CAAI,cAAe,CAAA,KAAA,EAAO,EAAE,GAAK,EAAA,IAAA,CAAK,UAAW,CAAA,GAAA,EAAK,CAAA;AACxE,IAAA,MAAM,KAAQ,GAAA;AAAA,MACV,GAAG,GAAA;AAAA,MACH,MAAA,EAAQQ,oBAAc,GAAG,CAAA;AAAA,MACzB,QAAQ,MAAO,CAAA,MAAA;AAAA,MACf,UAAU,EAAC;AAAA,MACX,WAAW;AAAC,KAChB;AACA,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,kBAAkB,CAAK,EAAA,EAAA;AAC3C,MAAA,MAAM,MAA8B,GAAA,GAAA,CAAI,WAAY,CAAA,GAAA,CAAI,CAAC,CAAA;AACzD,MAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACtB,QAAM,MAAA,IAAI,MAAM,sBAAsB,CAAA;AAAA;AAG1C,MAAI,IAAA,MAAA,CAAO,IAAK,CAAA,IAAA,KAAS,UAAY,EAAA;AACjC,QAAA,IAAA,CAAK,SAAS,IAAK,CAAA,EAAE,KAAK,MAAQ,EAAA,MAAA,EAAQ,OAAO,CAAA;AAAA;AACrD;AAEJ,IAAA,OAAO,EAAE,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,KAAM,EAAA;AAAA;AAE3C;AAEa,IAAA,WAAA,GAAc,OACvB,GAAA,EACA,KACmC,KAAA;AACnC,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,MAAM,UAAa,GAAA,GAAA;AACnB,EAAA,MAAM,UAAa,GAAA,GAAA;AACnB,EAAI,IAAA,MAAA,CAAO,iBAAiB,UAAY,EAAA;AACpC,IAAA,WAAA,MAAiB,MAAM,UAAY,EAAA;AAC/B,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,MAAA,IAAIF,4BAAmB,CAAAC,4BAAA,CAAmB,EAAE,CAAA,EAAG,KAAK,CAAG,EAAA;AACnD,QAAO,OAAA,QAAA;AAAA;AACX;AACJ,GACG,MAAA;AACH,IAAI,IAAA,UAAA,GAAa,MAAM,UAAA,CAAW,IAAK,EAAA;AACvC,IAAO,OAAA,EAAE,UAAW,CAAA,IAAA,IAAQ,KAAQ,CAAA,EAAA;AAChC,MAAA,MAAM,KAAK,UAAW,CAAA,KAAA;AACtB,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,MAAA,IAAID,4BAAmB,CAAAC,4BAAA,CAAmB,EAAE,CAAA,EAAG,KAAK,CAAG,EAAA;AACnD,QAAO,OAAA,QAAA;AAAA;AAEX,MAAa,UAAA,GAAA,MAAM,WAAW,IAAK,EAAA;AAAA;AACvC;AAKJ,EAAO,OAAA,QAAA;AACX;AAEa,IAAA,WAAA,GAAc,OAAO,GAAgF,KAAA;AAC9G,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAI,IAAA,UAAA,GAAa,MAAM,GAAA,CAAI,IAAK,EAAA;AAChC,EAAO,OAAA,EAAE,UAAW,CAAA,IAAA,IAAQ,KAAQ,CAAA,EAAA;AAChC,IAAS,QAAA,CAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAC9B,IAAa,UAAA,GAAA,MAAM,IAAI,IAAK,EAAA;AAAA;AAEhC,EAAO,OAAA,QAAA;AACX;AC3JA,IAAM,sBAAyB,GAAA,CAAA;AAC/B,IAAM,YAAe,GAAA,CAAA;AACrB,IAAM,mBAAsB,GAAA,IAAA,CAAK,KAAO,CAAA,CAAA,IAAA,GAAO,KAAK,CAAC,CAAA;AAErD,IAAM,MAAA,GAAS,CAACb,IAAwB,KAAA;AACpC,EAAM,MAAA,GAAA,GAAM,IAAIe,eAAO,EAAA;AACvB,EAAA,GAAA,CAAI,OAAOf,IAAG,CAAA;AACd,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,UAAA,EAAY,CAAA;AACvC,CAAA;AAEA,IAAM,KAAA,GAAQ,CAAC,GAAwB,KAAA;AACnC,EAAO,OAAA,MAAA,CAAO,KAAK,MAAO,CAAA,GAAG,EAAE,QAAS,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AACpD,CAAA;AAEO,SAAS,qBAAqB,IAA8C,EAAA;AAC/E,EAAM,MAAA,IAAA,GAAOM,eAAW,CAAA,KAAA,CAAMA,eAAW,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAG,CAAGA,EAAAA,eAAAA,CAAW,MAAO,CAAA,IAAA,EAAM,CAAA;AAGpF,EAAO,MAAA,CAAA,OAAA,CAAQ,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAC3C,IAAK,IAAA,CAAA,GAAA,CAAI,KAAM,CAAA,GAAG,CAAG,EAAA,aAAA,CAAc,OAAO,IAAK,CAAA,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA;AAAA,GACjE,CAAA;AAED,EAAOD,OAAAA,cAAAA,GAAY,QAAS,CAAA,sBAAA,EAAwB,CAAC,CAAE,CAAA,SAAA,CAAU,IAAI,CAAA,CAAE,OAAQ,EAAA;AACnF;AAEO,SAAS,cAAc,IAAoB,EAAA;AAE9C,EAAM,MAAA,MAAA,GAAS,cAAe,CAAA,IAAA,EAAM,mBAAmB,CAAA;AAEvD,EAAA,MAAM,IAAI,MAAO,CAAA,WAAA,CAAY,CAAC,OAAA,EAAS,OAAO,KAAU,KAAA;AACpD,IAAA,IAAI,UAAU,CAAG,EAAA;AACb,MAAQ,OAAA,CAAA,QAAA,CAAS,cAAc,CAAC,CAAA;AAAA;AAEpC,IAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAM,MAAA,IAAA,GAAO,QAAQ,OAAQ,EAAA;AAC7B,MAAOA,OAAAA,cAAAA,EAAY,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,KAC7B,MAAA;AACH,MAAO,OAAA,OAAA;AAAA;AACX,GACJ,EAAGA,gBAAW,CAAA;AACd,EAAA,OAAO,EAAE,OAAQ,EAAA;AACrB;AAEA,SAAS,cAAA,CAAe,MAAc,SAA6B,EAAA;AAC/D,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAO,OAAA,IAAA,CAAK,aAAa,CAAG,EAAA;AACxB,IAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,SAAS,CAAC,CAAA;AACpC,IAAO,IAAA,GAAA,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA;AAE/B,EAAO,OAAA,MAAA;AACX;AC1CO,IAAe,KAAf,MAAkB;AAazB;AAbsB,EAAA,CACX,QAAW,GAAA,SAAA;AADA,EAAA,CAEX,qBAAwB,GAAA,UAAA;AAFb,EAAA,CAGX,iBAAoB,GAAA,SAAA;AAHT,EAAA,CAIX,QAAW,GAAA,UAAA;AAJA,EAAA,CAKX,IAAO,GAAA,UAAA;AALI,EAAA,CAMX,iBAAoB,GAAA,UAAA;AANT,EAAA,CAQX,sBAAyB,GAAA,SAAA;AARd,EAAA,CASX,mBAAsB,GAAA,UAAA;AATX,EAAA,CAUX,IAAO,GAAA,UAAA;AAVI,EAAA,CAWX,YAAe,GAAA,CAAA;AAXJ,EAAA,CAYX,cAAiB,GAAA,CAAA;AAGrB,IAAe,SAAf,MAAsB;AAY7B;AAZsB,MAAA,CACX,UAAa,GAAA,GAAA;AADF,MAAA,CAEX,SAAY,GAAA,EAAA;AAFD,MAAA,CAGX,iBAAoB,GAAA,EAAA;AAHT,MAAA,CAIX,yBAA4B,GAAA,EAAA;AAJjB,MAAA,CAKX,QAAW,GAAA,KAAA;AALA,MAAA,CAMX,SAAY,GAAA,GAAA;AAND,MAAA,CAOX,cAAiB,GAAA,GAAA;AAPN,MAAA,CAQX,cAAiB,GAAA,GAAA;AARN,MAAA,CASX,gBAAmB,GAAA,GAAA;AATR,MAAA,CAUX,eAAkB,GAAA,GAAA;AAVP,MAAA,CAWX,aAAgB,GAAA,GAAA;AAcpB,SAAS,yBAAyB,MAAkC,EAAA;AACvE,EAAA,OAAOA,gBACF,CAAA,UAAA,CAAW,CAAC,CAAA,CACZ,aAAa,MAAO,CAAA,KAAK,CACzB,CAAA,QAAA,CAAS,OAAO,OAAO,CAAA,CACvB,SAAS,MAAO,CAAA,WAAW,EAC3B,OAAQ,EAAA;AACjB;AAEO,SAAS,oBAAoB,OAAoC,EAAA;AACpE,EAAOA,OAAAA,cAAAA,EACF,CAAA,SAAA,CAAU,OAAQ,CAAA,IAAA,EAAM,CAAC,CAAA,CACzB,eAAgB,CAAA,OAAA,CAAQ,GAAG,CAAA,CAC3B,OAAQ,EAAA;AACjB;AAEa,IAAA,YAAA,GAAN,MAAM,aAAiC,CAAA;AAAA,EAC1C,WAAA,CACa,SACA,IACX,EAAA;AAFW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA;AACV,EAEH,OAAO,kBAAkB,OAAgC,EAAA;AACrD,IAAO,OAAA,IAAI,cAAa,OAAO,CAAA;AAAA;AACnC,EAEA,OAAO,gBAAA,CAAiB,MAA4B,EAAA,IAAA,EAAY,YAAY,CAAiB,EAAA;AACzF,IAAM,MAAA,IAAA,GAAO,yBAAyB,MAAM,CAAA;AAC5C,IAAM,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,IAAK,EAAA;AAC1B,IAAA,OAAO,IAAI,aAAaE,CAAAA,oBAAAA,CAAgB,SAAW,EAAA,IAAI,GAAG,IAAI,CAAA;AAAA;AAClE,EAEA,MAAM,UAAA,CAAW,QAA4B,EAAA,GAAA,EAAa,KAA8B,EAAA;AACpF,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUH,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAMC,cAAU,EAAA,CAAE,OAAQ;AAAA,KAC7B,CAAA;AAAA;AACL,EAEA,OAAiB,sBACb,CAAA,aAAA,EACA,kBACA,EAAA,aAAA,EACA,WAA4B,CACxB,EAAA;AACJ,IAAOA,OAAAA,cAAAA,EACF,CAAA,SAAA,CAAU,EAAG,CAAA,iBAAA,EAAmB,EAAE,CAAA,CAClC,SAAU,CAAA,QAAA,EAAU,EAAE,CAAA,CACtB,UAAW,CAAA,aAAa,EACxB,YAAa,CAAA,IAAI,CACjB,CAAA,YAAA,CAAa,aAAa,CAAA,CAC1B,UAAW,CAAA,kBAAkB,CAC7B,CAAA,QAAA,CAAS,KAAK,CAAA,CACd,OAAQ,EAAA;AAAA;AACjB,EACA,OAAO,YACH,IACA,EAAA,EAAA,EACA,eACA,kBACA,EAAA,gBAAA,EACA,WAA4B,CACxB,EAAA;AACJ,IAAM,MAAA,OAAA,GAAUA,cAAU,EAAA,CACrB,SAAU,CAAA,EAAA,CAAG,iBAAmB,EAAA,EAAE,CAClC,CAAA,SAAA,CAAU,CAAG,EAAA,EAAE,CACf,CAAA,UAAA,CAAW,aAAa,CAAA,CACxB,YAAa,CAAA,IAAI,CACjB,CAAA,YAAA,CAAa,IAAI,CAAA,CACjB,UAAW,CAAA,kBAAkB,CAC7B,CAAA,aAAA,CAAc,IAAI,CAAA,CAClB,OAAQ,EAAA;AAEb,IAAOA,OAAAA,cAAAA,GACF,SAAU,CAAA,EAAA,CAAG,MAAM,EAAE,CAAA,CACrB,SAAU,CAAA,QAAA,EAAU,EAAE,CAAA,CACtB,aAAa,EAAE,CAAA,CACf,UAAW,CAAA,gBAAgB,CAC3B,CAAA,UAAA,CAAW,aAAa,CACxB,CAAA,QAAA,CAAS,OAAO,CAAA,CAChB,OAAQ,EAAA;AAAA;AACjB,EACA,MAAM,QACF,CAAA,QAAA,EACA,KACA,EACA,EAAA,aAAA,EACA,oBACA,gBACa,EAAA;AACb,IAAA,IAAI,oBAAoB,kBAAoB,EAAA;AACxC,MAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA;AAAA;AAEjE,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAM,cAAa,WAAY,CAAA,IAAA,CAAK,SAAS,EAAI,EAAA,aAAA,EAAe,oBAAoB,gBAAgB,CAAA;AAAA,MACpG,KAAA,EAAO,gBAAmBI,GAAAA,WAAAA,CAAO,OAAO;AAAA,KAC3C,CAAA;AAAA;AACL;AAAA;AAAA,EAIA,OAAO,gBAAiB,CAAA,KAAA,EAAgB,eAAgC,EAAA;AACpE,IAAA,OAAOH,gBACF,CAAA,SAAA,CAAU,SAAY,EAAA,EAAE,EACxB,SAAU,CAAA,CAAA,EAAG,EAAE,CAAA,CACf,aAAa,KAAK,CAAA,CAClB,QAAS,CAAA,eAAe,EACxB,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,cACF,QACA,EAAA,GAAA,EACA,OACA,eACA,EAAA,KAAA,GAAgBG,WAAO,CAAA,KAAK,CACf,EAAA;AACb,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUJ,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAM,EAAA,aAAA,CAAa,gBAAiB,CAAA,KAAA,EAAO,eAAe,CAAA;AAAA,MAC1D;AAAA,KACH,CAAA;AAAA;AACL,EAEA,OAAO,mBAAmB,QAAyB,EAAA;AAC/C,IAAA,OAAOC,cAAU,EAAA,CACZ,SAAU,CAAA,EAAA,CAAG,cAAc,EAAE,CAAA,CAC7B,SAAU,CAAA,CAAA,EAAG,EAAE,CAAA,CACf,YAAa,CAAA,QAAQ,EACrB,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,eAAA,CAAgB,QAA4B,EAAA,GAAA,EAAa,QAAkC,EAAA;AAC7F,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAM,aAAa,CAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,MAC9C,KAAA,EAAOI,YAAO,MAAM;AAAA,KACvB,CAAA;AAAA;AACL,EACA,OAAO,qBAAqB,OAAqB,EAAA;AAC7C,IAAA,OAAOH,cAAU,EAAA,CACZ,SAAU,CAAA,EAAA,CAAG,gBAAgB,EAAE,CAAA,CAC/B,SAAU,CAAA,CAAA,EAAG,EAAE,CAAA,CACf,QAAS,CAAA,OAAO,EAChB,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,iBAAA,CAAkB,QAA4B,EAAA,GAAA,EAAa,OAA8B,EAAA;AAC3F,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAM,aAAa,CAAA,oBAAA,CAAqB,OAAO,CAAA;AAAA,MAC/C,KAAA,EAAOI,YAAO,MAAM;AAAA,KACvB,CAAA;AAAA;AACL,EACA,MAAM,gBAAiB,CAAA,QAAA,EAA4B,KAAkC,EAAA;AACjF,IAAA,MAAM,GAAM,GAAA,MAAM,QAAS,CAAA,GAAA,CAAI,oBAAsB,EAAA;AAAA,MACjD,EAAE,IAAM,EAAA,OAAA,EAAS,IAAMH,EAAAA,cAAAA,GAAY,YAAa,CAAA,KAAK,CAAE,CAAA,OAAA,EAAU;AAAA,KACpE,CAAA;AACD,IAAO,OAAA,GAAA,CAAI,MAAM,WAAY,EAAA;AAAA;AACjC,EAEA,MAAM,cACF,QAC2G,EAAA;AAC3G,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,GAAI,CAAA,iBAAA,EAAmB,EAAE,CAAA;AACpD,IAAM,MAAA,WAAA,GAAc,GAAI,CAAA,KAAA,CAAM,aAAc,EAAA;AAC5C,IAAM,MAAA,QAAA,GAAW,GAAI,CAAA,KAAA,CAAM,WAAY,EAAA;AACvC,IAAM,MAAA,YAAA,GAAe,GAAI,CAAA,KAAA,CAAM,WAAY,EAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,GAAI,CAAA,KAAA,CAAM,QAAS,EAAA;AACnC,IAAM,MAAA,UAAA,GAAa,GAAI,CAAA,KAAA,CAAM,QAAS,EAAA;AACtC,IAAO,OAAA;AAAA,MACH,WAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACJ;AAAA;AACJ,EAEA,MAAM,eAAe,QAA6C,EAAA;AAC9D,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,OAAO,GAAI,CAAA,WAAA;AAAA;AACf,EACA,MAAM,gBAAgB,QAA8C,EAAA;AAChE,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,OAAO,GAAI,CAAA,YAAA;AAAA;AACf,EACA,MAAM,WAAW,QAA2C,EAAA;AACxD,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,OAAO,GAAI,CAAA,OAAA;AAAA;AAEnB;ACnOO,SAAS,yBAAyB,MAAkC,EAAA;AACvE,EAAA,OAAOA,gBACF,CAAA,UAAA,CAAW,CAAC,CAAA,CACZ,aAAa,MAAO,CAAA,aAAa,CACjC,CAAA,YAAA,CAAa,OAAO,qBAAqB,CAAA,CACzC,SAAS,MAAO,CAAA,kBAAkB,EAClC,OAAQ,EAAA;AACjB;AAEa,IAAA,YAAA,GAAN,MAAM,aAAiC,CAAA;AAAA,EAC1C,WAAA,CACa,SACA,IACX,EAAA;AAFW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA;AACV,EAEH,OAAO,kBAAkB,OAAgC,EAAA;AACrD,IAAO,OAAA,IAAI,cAAa,OAAO,CAAA;AAAA;AACnC,EAEA,OAAO,gBAAA,CAAiB,MAA4B,EAAA,IAAA,EAAY,YAAY,CAAiB,EAAA;AACzF,IAAM,MAAA,IAAA,GAAO,yBAAyB,MAAM,CAAA;AAC5C,IAAM,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,IAAK,EAAA;AAC1B,IAAA,OAAO,IAAI,aAAaE,CAAAA,oBAAAA,CAAgB,SAAW,EAAA,IAAI,GAAG,IAAI,CAAA;AAAA;AAClE,EAEA,MAAM,UAAA,CAAW,QAA4B,EAAA,GAAA,EAAa,KAA8B,EAAA;AACpF,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUH,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAMC,cAAU,EAAA,CAAE,OAAQ;AAAA,KAC7B,CAAA;AAAA;AACL,EAEA,MAAM,iBAAiB,QAA6C,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,MAAM,QAAA,CAAS,QAAS,EAAA;AACtC,IAAI,IAAA,KAAA,CAAM,KAAM,CAAA,IAAA,KAAS,QAAU,EAAA;AAC/B,MAAO,OAAA,EAAA;AAAA;AAEX,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,GAAI,CAAA,iBAAA,EAAmB,EAAE,CAAA;AACpD,IAAO,OAAA,GAAA,CAAI,MAAM,aAAc,EAAA;AAAA;AACnC,EACA,OAAO,eACH,CAAA,aAAA,EACA,IACA,eACA,EAAA,aAAA,EACA,oBACA,cACI,EAAA;AACJ,IAAA,OAAOA,cAAU,EAAA,CACZ,SAAU,CAAA,SAAA,EAAW,EAAE,CAAA,CACvB,SAAU,CAAA,CAAA,EAAG,EAAE,CAAA,CACf,UAAW,CAAA,aAAa,CACxB,CAAA,YAAA,CAAa,EAAE,CAAA,CACf,YAAa,CAAA,eAAe,CAC5B,CAAA,aAAA,CAAc,aAAa,CAAA,CAC3B,UAAW,CAAA,kBAAkB,CAC7B,CAAA,aAAA,CAAc,cAAc,CAAA,CAC5B,OAAQ,EAAA;AAAA;AACjB,EACA,MAAM,YACF,CAAA,QAAA,EACA,GACA,EAAA,KAAA,EACA,eACA,EACA,EAAA,eAAA,EACA,aACA,EAAA,kBAAA,EACA,cACa,EAAA;AACb,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,MAAM,aAAa,CAAA,eAAA;AAAA,QACf,aAAA;AAAA,QACA,EAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACA;AAAA,KACH,CAAA;AAAA;AACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAA,CAAY,aAAuB,EAAA,eAAA,EAA0B,aAAkC,EAAA;AAClG,IAAA,OAAOC,gBACF,CAAA,SAAA,CAAU,YAAY,EAAE,CAAA,CACxB,UAAU,CAAG,EAAA,EAAE,EACf,UAAW,CAAA,aAAa,EACxB,YAAa,CAAA,eAAe,EAC5B,aAAc,CAAA,aAAa,EAC3B,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,QACF,CAAA,QAAA,EACA,KACA,KACA,EAAA,aAAA,EACA,iBACA,aACa,EAAA;AACb,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAM,EAAA,aAAA,CAAa,WAAY,CAAA,aAAA,EAAe,iBAAiB,aAAa,CAAA;AAAA,MAC5E;AAAA,KACH,CAAA;AAAA;AACL;AAAA;AAAA;AAAA,EAIA,OAAO,mBAA4B,GAAA;AAC/B,IAAOC,OAAAA,cAAAA,EACF,CAAA,SAAA,CAAU,UAAY,EAAA,EAAE,EACxB,SAAU,CAAA,CAAA,EAAG,EAAE,CAAA,CACf,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,gBAAiB,CAAA,QAAA,EAA4B,GAA4B,EAAA;AAC3E,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAM,cAAa,mBAAoB,EAAA;AAAA,MACvC,KAAA,EAAOI,YAAO,KAAK;AAAA,KACtB,CAAA;AAAA;AACL;AAAA;AAAA;AAAA,EAIA,OAAO,sBAAuB,CAAA,IAAA,EAAe,MAAsB,EAAA;AAC/D,IAAA,OAAOH,gBACF,CAAA,SAAA,CAAU,YAAY,EAAE,CAAA,CACxB,UAAU,CAAG,EAAA,EAAE,EACf,YAAa,CAAA,IAAI,EACjB,UAAW,CAAA,MAAM,EACjB,aAAc,CAAA,IAAI,EAClB,OAAQ,EAAA;AAAA;AACjB,EAEA,MAAM,mBAAA,CAAoB,QAA4B,EAAA,GAAA,EAAa,MAAe,MAA+B,EAAA;AAC7G,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,UAAUD,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAM,EAAA,aAAA,CAAa,sBAAuB,CAAA,IAAA,EAAM,MAAM,CAAA;AAAA,MACtD,KAAA,EAAOI,YAAO,KAAK;AAAA,KACtB,CAAA;AAAA;AACL,EAEA,MAAM,QACF,QACuG,EAAA;AACvG,IAAM,MAAA,EAAE,OAAU,GAAA,MAAM,SAAS,GAAI,CAAA,iBAAA,EAAmB,EAAE,CAAA;AAC1D,IAAO,OAAA;AAAA,MACH,OAAA,EAAS,MAAM,aAAc,EAAA;AAAA,MAC7B,aAAA,EAAe,MAAM,WAAY,EAAA;AAAA,MACjC,qBAAA,EAAuB,MAAM,WAAY,EAAA;AAAA,MACzC,WAAA,EAAa,MAAM,QAAS;AAAA,KAChC;AAAA;AACJ,EAEA,MAAM,WAAW,QAA6C,EAAA;AAC1D,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,QAAQ,CAAA;AACvC,IAAA,OAAO,GAAI,CAAA,OAAA;AAAA;AAEnB;AChLA,IAAM,YAAe,GAAA,CAAA;AACrB,IAAM,OAAA,GAAU,MAAM,YAAY,CAAA;AAClC,IAAM,WAAc,GAAA,SAAA;AAYpB,SAAS,0BAA0B,aAA6B,EAAA;AAC5D,EAAI,IAAA,CAAIQ,aAAW,CAAA,UAAA,CAAA,aAAa,CAAG,EAAA;AAC/B,IAAGA,aAAU,CAAA,SAAA,CAAA,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA;AAEvD;AAEA,SAAS,WAAA,CAAY,UAAkB,OAAwB,EAAA;AAC3D,EAAM,MAAA,OAAA,GAAU,MAAO,CAAA,OAAA,CAAQ,OAAO,CAAA;AACtC,EAAA,MAAM,gBAAgB,OAAQ,CAAA,IAAA,CAAK,CAAC,GAAG,MAAM,CAAA,EAAG,GAAG,MAAM,CAAM,KAAA,UAAA,CAAW,MAAM,CAAI,GAAA,UAAA,CAAW,MAAM,CAAC,CAAA;AACtG,EAAM,MAAA,QAAA,GAAW,KAAK,SAAU,CAAA,MAAA,CAAO,YAAY,aAAa,CAAA,EAAG,MAAM,CAAC,CAAA;AAC1E,EAAGA,aAAA,CAAA,aAAA,CAAc,QAAU,EAAA,CAAA,EAAG,QAAQ;AAAA,CAAA,EAAM,MAAM,CAAA;AACtD;AAEA,SAAS,qBAAqB,QAA2B,EAAA;AACrD,EAAO,IAAAA,aAAA,CAAA,UAAA,CAAW,QAAQ,CAAG,EAAA;AACzB,IAAM,MAAA,WAAA,GAAyBA,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,MAAM,CAAA;AAC5D,IAAO,OAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AAAA,GAC1B,MAAA;AACH,IAAA,OAAO,EAAC;AAAA;AAEhB;AAEA,SAAS,MAAM,CAAmB,EAAA;AAC9B,EAAA,IAAI,CAAI,GAAA,EAAA;AACR,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AACxB,IAAK,CAAA,IAAA,GAAA;AAAA;AAET,EAAO,OAAA,CAAA;AACX;AAEO,SAAS,eAAA,CAAgB,KAAe,EAAA,SAAA,GAAY,CAAW,EAAA;AAClE,EAAA,IAAI,QAAQ,KAAQ,GAAA,OAAA;AAEpB,EAAA,IAAI,OAAO,KAAQ,GAAA,OAAA;AACnB,EAAM,MAAA,gBAAA,GAAmB,KAAM,CAAA,YAAA,GAAe,SAAS,CAAA;AACvD,EAAI,IAAA,IAAA,GAAO,mBAAmB,EAAI,EAAA;AAE9B,IAAQ,IAAA,IAAA,gBAAA;AACR,IAAA,IAAI,QAAQ,OAAS,EAAA;AACjB,MAAQ,IAAA,IAAA,OAAA;AACR,MAAS,KAAA,IAAA,EAAA;AAAA;AACb;AAEJ,EAAQ,IAAA,IAAA,gBAAA;AAER,EAAA,OAAO,GAAG,KAAM,CAAA,QAAA,EAAU,CAAG,EAAA,IAAA,KAAS,KAAK,GAAM,GAAA,IAAA,CAAK,UAAW,CAAA,QAAA,CAAS,WAAW,GAAG,CAAA,CAAE,QAAQ,KAAO,EAAA,EAAE,IAAI,EAAE,CAAA,CAAA;AACrH;AAEA,SAAS,WAAA,CAAY,KAA2B,EAAA,SAAA,GAAY,CAAW,EAAA;AACnE,EAAI,IAAA,KAAA,KAAU,QAAkB,OAAA,KAAA;AAEhC,EAAO,OAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAC3C;AAoBO,SAAS,qBACZ,CAAA,YAAA,EACA,UACA,EAAA,WAAA,EACA,OACI,EAAA;AACJ,EAAA,MAAM,EAAE,KAAA,EAAU,GAAA,IAAI,KAAM,EAAA;AAC5B,EAAgB,WAAA,KAAA,WAAA,GAAA,KAAA,CAAA;AAChB,EAAQ,OAAA,CAAA,IAAA,CAAK,aAAa,KAAM,CAAA,IAAI,EAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AAC/C,EAAA,IAAI,cAAiB,GAAA,EAAA;AACrB,EAAA,IAAI,UAAmB,EAAC;AACxB,EAAI,IAAA,QAAA,GAAW,SAAS,QAAY,IAAA,WAAA;AACpC,EAAA,IAAI,SAAS,UAAY,EAAA;AACrB,IAAA,yBAAA,CAA0B,QAAQ,CAAA;AAClC,IAAA,QAAA,GAAWd,wBAAK,IAAK,CAAA,QAAA,EAAU,CAAG,EAAA,OAAA,CAAQ,QAAQ,CAAO,KAAA,CAAA,CAAA;AACzD,IAAA,OAAA,GAAU,qBAAqB,QAAQ,CAAA;AAAA;AAE3C,EAAQ,OAAA,CAAA,KAAA;AAAA,IACJ,YAAA,CACK,GAAI,CAAA,CAAC,EAAO,KAAA;AACT,MAAA,IAAI,EAAG,CAAA,WAAA,CAAY,IAAS,KAAA,SAAA,EAAkB,OAAA,KAAA,CAAA;AAE9C,MAAM,MAAA,IAAA,GAAO,EAAG,CAAA,SAAA,EAAW,IAAK,CAAA,IAAA,KAAS,aAAa,EAAG,CAAA,SAAA,CAAU,IAAK,CAAA,UAAA,EAAe,GAAA,KAAA,CAAA;AACvF,MAAM,MAAA,EAAA,GAAK,IAAS,KAAA,KAAA,CAAA,GAAY,EAAK,GAAA,IAAA,CAAK,iBAAiB,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,EAAE,CAAI,GAAA,EAAA;AAEvF,MAAA,MAAM,SAAY,GAAA,WAAA,CAAY,EAAG,CAAA,SAAA,CAAU,KAAK,CAAA;AAEhD,MAAA,MAAM,WAAc,GAAA,WAAA;AAAA,QAChB,EAAA,CAAG,YAAY,YAAa,CAAA,IAAA,KAAS,OAAO,EAAG,CAAA,WAAA,CAAY,aAAa,OAAU,GAAA,KAAA;AAAA,OACtF;AAEA,MAAA,MAAM,eAAe,WAAY,CAAA,EAAA,CAAG,WAAY,CAAA,WAAA,EAAa,gBAAgB,KAAS,CAAA,CAAA;AAEtF,MAAgB,WAAA;AAAA,QACZ,EAAA,CAAG,WAAW,IAAK,CAAA,IAAA,KAAS,aAAa,EAAG,CAAA,SAAA,CAAU,IAAK,CAAA,KAAA,CAAM,KAAQ,GAAA,KAAA;AAAA;AAG7E,MAAiB,WAAA;AAAA,QACb,EAAA,CAAG,WACE,CAAA,MAAA,EACA,CAAA,MAAA;AAAA,UACG,CAAC,KAAO,EAAA,OAAA,KACJ,KAAS,IAAA,OAAA,CAAQ,IAAK,CAAA,IAAA,KAAS,UAAa,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,KAAQ,GAAA,EAAA,CAAA;AAAA,UAC3E;AAAA;AACJ;AAGR,MAAA,MAAM,SAAY,GAAA,WAAA;AAAA,QACd,EAAA,CAAG,WAAW,IAAK,CAAA,IAAA,KAAS,aAAa,EAAG,CAAA,SAAA,CAAU,KAAK,UAAa,GAAA,KAAA;AAAA,OAC5E;AAGA,MAAA,MAAM,gBACF,EAAG,CAAA,OAAA,CAAQ,QAAS,CAAA,EAAE,EAAE,MAAU,IAAA,EAAA,GAAK,SAAYL,GAAAA,YAAAA,CAAQ,SAAS,IAAO,GAAA,EAAA,CAAG,OAAQ,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA;AACtG,MAAM,MAAA,QAAA,GAAW,EAAG,CAAA,QAAA,EAAc,IAAA,UAAA,GAAa,UAAW,CAAA,EAAA,CAAG,QAAS,EAAC,CAAI,GAAA,EAAA,CAAG,QAAS,EAAA;AACvF,MAAA,cAAA,IAAkB,GAAG,SAAU,CAAA,KAAA,IAAS,EAAG,CAAA,WAAA,CAAY,aAAa,YAAgB,IAAA,EAAA,CAAA;AAEpF,MAAA,IAAI,SAAS,UAAY,EAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,YAAY,cAAc,CAAA;AAEvE,MAAO,OAAA;AAAA,QACH,OAAS,EAAA,aAAA;AAAA,QACT,EAAI,EAAA,QAAA;AAAA;AAAA;AAAA,QAGJ,SAAA;AAAA,QACA,YAAc,EAAA,SAAA;AAAA,QACd,aAAe,EAAA,YAAA;AAAA;AAAA,QAEf,UAAY,EAAA,WAAA;AAAA;AAAA;AAAA,QAGZ,aAAA,EAAe,YAAY,cAAc;AAAA,OAC7C;AAAA,KACH,CACA,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,KAAS,CAAA;AAAA,GACtC;AACA,EAAA,IAAI,OAAS,EAAA,UAAA,EAAwB,WAAA,CAAA,QAAA,EAAU,OAAO,CAAA;AAC1D","file":"index.cjs","sourcesContent":["import { Address, Cell } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\nimport * as crc32 from 'crc-32'\n\n/**\n * Wraps a blueprint-like artifact in a `Cell`. The constrains on the input type are loosened\n * and only the `hex` property is made required.\n *\n * @param artifact Blueprint JSON artifact object\n * @returns {Cell}\n */\nexport const cellFromArtifact = ({ hex }: { hex: string; hash?: string; hashBase64?: string }): Cell =>\n Cell.fromHex(hex)\n\n// ------------- Testing utils for Lz Ton Packet encoding/decoding -----------\n\nexport function getOpcodeCRC(input: string): bigint {\n return BigInt(crc32.str(input) >>> 0) // Ensure the result is unsigned and convert to bigint\n}\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\nexport function bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const addressToBigInt = (address: Address): bigint => {\n return BigInt('0x' + address.hash.toString('hex'))\n}\n\n/**\n * Convert a value to a 32 byte buffer, if the value is a string, it can only be a hex string\n * @param value\n * @param maxIntermediateBufferSize\n */\nexport function to32ByteBuffer(value: bigint | number | string | Uint8Array, maxIntermediateBufferSize = 66): Buffer {\n if (typeof value === 'string') {\n if (!isValidHex(value)) {\n throw new Error('only hex string is supported')\n }\n let hex = trim0x(value)\n if (hex.length % 2 !== 0) {\n hex = '0' + hex\n }\n value = toBigIntBE(Buffer.from(hex, 'hex'))\n }\n if (value instanceof Uint8Array) {\n value = toBigIntBE(Buffer.from(value))\n }\n const bf = toBufferBE(BigInt(value), maxIntermediateBufferSize)\n // trim from the left, keep the right 32 bytes\n return bf.subarray(-32)\n}\n\nfunction trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\nfunction isValidHex(str: string): boolean {\n const hexRegex = /^(0x)?[0-9A-Fa-f]+$/\n return hexRegex.test(str)\n}\n\nexport function findDeepestCell(cell: Cell): { subTreeCells: number } {\n // Get all references from the current cell\n const refs = Array.from({ length: cell.refs.length }, (_, i) => cell.refs.at(i))\n\n // Base case: if no references, return current cell with depth 0\n if (refs.length === 0) {\n return { subTreeCells: 1 }\n }\n\n let size = 0\n\n // Check all references\n for (const ref of refs) {\n if (!ref) continue\n\n size += findDeepestCell(ref).subTreeCells\n }\n\n return { subTreeCells: size }\n}\n","import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { getOpcodeCRC } from './utils'\n\nexport interface ConstructorArgs {\n [key: string]: string\n}\n\n// requirements:\n// 1. each attribute can have only one dependency (one constructor call)\n// 2. The name of the inputArg which is a class should be the same as the class name\nexport interface Attribute {\n name: string\n type: string\n value: string\n}\n\nexport type ConstructorCallGenerator = (args: ConstructorArgs, _: unknown) => string\n\nexport interface FieldMap {\n [key: number]: string\n}\nexport interface InverseFieldMap {\n [key: string]: number\n}\n\nexport interface TonObject {\n constructorName: string\n constructorInputArgs: ConstructorArgs\n // the order of these attributes need to be preserved\n attributes: Attribute[]\n // the inside ::NAME of the object\n tonName: string\n // infer the implicit map of orders of the objects at declaration and the fields\n fieldMap: FieldMap\n inverseFieldMap: InverseFieldMap\n // You need to have generated everything to be able to resolve the dependencies to generate the codes.\n constructorCode?: string\n constructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for types\n tsTypeName?: string\n tsTypeCode?: string\n // stuff for deconstructor\n deconstructorName?: string\n deconstructorCode?: string\n deconstructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for deconstructing md's\n is_md?: boolean\n}\n\n// maps the name of the ton object to the object\nexport interface TonObjectsDict {\n [name: string]: TonObject\n}\n\nexport interface TonViewFunction {\n name: string\n args: { [key: string]: string }\n returnType: string[]\n code: string\n}\n\n// maps the name of the contract to a list of view functions\nexport interface TonViewFunctionsDict {\n [name: string]: TonViewFunction[]\n}\n\nconst file_signature_header = `////// Generated by sdk/sdk-generator.ts`\nconst ERRORCODE_MASK = 0x7ffn\n\nfunction tonTypeToTStype(tonType: string): string {\n switch (tonType) {\n case 'int':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n case 'address':\n return 'bigint'\n\n case 'cell':\n case 'cellRef':\n 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 console.log(`Parsing ${name}...`)\n\n const tonNameRegex = /const int\\s+(?:md::)?[\\w:]+::NAME = \"(.*?)\"u;/\n const tonNameMatch = strInput.match(tonNameRegex)\n const tonName = tonNameMatch ? tonNameMatch[1] : name\n\n const attributes = parseDeclareLines(body, fieldMap)\n results[name] = {\n constructorInputArgs: args,\n attributes,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n\n return results\n}\n\nexport function saveBaseEventHandler(\n directory: string,\n opcodesImportPath = '../constants',\n allTypesImportPath = './allTypes',\n tonObjectUnwrapperImportPath = './TonObjectUnwrapper',\n tonContractWrapperImportPath = './TonContractWrapper'\n): void {\n const allTypes = ['ExtendedContract', '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'\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 TonObjectUnwrapper.getTypeOf(wrapper, this._event.body)\n const tsCasterName = 'get' + nameMap[this.bodyName] + 'ToTS'\n\n const method = TonObjectUnwrapper[tsCasterName as keyof typeof TonObjectUnwrapper]\n if (typeof method === 'function') {\n this.body = await method(wrapper, this._event.body)\n } else {\n console.log('Method' + tsCasterName + 'does not exist.')\n }\n\n this.initialStorage = this._event.initialStorage\n this.initialized = true\n return this.initialized\n }\n}\n\nexport class 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 saveClasslibWrapper(directory: string, baseWrapper?: string): void {\n if (baseWrapper === undefined) {\n baseWrapper = `import { BaseWrapper, SendRequestOptions } from '@layerzerolabs/ton-sdk-tools'`\n }\n const savedCode = `${file_signature_header}\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n contractAddress,\n beginCell,\n} from '@ton/core'\n\n${baseWrapper}\n\nexport type GetIntFnNames =\n | 'cl::get<uint8>'\n | 'cl::get<uint16>'\n | 'cl::get<uint32>'\n | 'cl::get<uint64>'\n | 'cl::get<uint256>'\n | 'cl::get<coins>'\n | 'cl::get<bool>'\n | 'cl::get<address>'\n\nexport class 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(\n provider: ContractProvider,\n via: Sender,\n opts: SendRequestOptions,\n ): 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 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`\n\n fs.writeFileSync(path.join(directory, 'ClasslibWrapper.ts'), savedCode)\n}\n\nexport function saveTonContractWrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n classlibWrapperImportPath = './ClasslibWrapper'\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 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 ${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): 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}'\n\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n\nexport class LzDict {\n _cell: Cell\n\n constructor(data: Cell) {\n this._cell = data\n }\n\n static empty(): LzDict {\n return new LzDict(beginCell().endCell())\n }\n\n async getCell(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<Cell> {\n return wrapper.getDictCellItem(this._cell, key)\n }\n\n async getBigInt(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n return wrapper.getDictUint256Item(this._cell, key)\n }\n\n async set(key: bigint, value: Cell, wrapper: ExtendedContract<TonContractWrapper>): Promise<void> {\n this._cell = await wrapper.getSetDictItem(this._cell, key, value)\n }\n\n asCell(): Cell {\n return this._cell\n }\n}\n\nexport 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): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\n 'ExtendedContract',\n 'LzDict',\n 'Md',\n 'nameMap',\n ].sort()\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Cell, Transaction, TransactionComputeVm, TransactionDescriptionGeneric, beginCell } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\nimport { flattenTransaction } from '@ton/test-utils'\n\nimport { getLzDict,\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\n\nexport class TonObjectUnwrapper {\n static async getTypeOf(provider: ExtendedContract<TonContractWrapper>, obj_cell: Cell): Promise<string> {\n const ret = await provider.getViewFunction('cl::typeof', [{ type: 'cell', cell: obj_cell }])\n return TonContractWrapper.bigintToAsciiString(ret.readBigNumber())\n }\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 contractDirs.forEach((dir) => {\n const files = fs.readdirSync(dir).filter((file) => file.endsWith('.fc') || file.endsWith('.func'))\n\n files.forEach((file) => {\n const filePath = path.join(dir, file)\n const contractName = snakeToCamelCase(path.basename(path.dirname(dir)) + '_' + path.basename(dir))\n const content = fs.readFileSync(filePath, 'utf-8')\n\n const functionRegex =\n /(\\((?:[^()]+,\\s*)*[^()]+\\)|[\\w:]+)\\s+(\\w+(?:::\\w+)*)\\s*\\(([\\w\\s,$·]*)\\)\\s*·?\\s*(impure)?\\s*(inline\\s*)?method_id\\s*\\{([^}]*)\\}/g\n let match\n\n while ((match = functionRegex.exec(content)) !== null) {\n const [, returnType, name, argsString, , _body] = match\n // skip the constructors\n if (name.includes('::New')) {\n continue\n }\n const tonArgs: { [key: string]: string } = {}\n const tsArgs: { [key: string]: string } = {}\n\n const argPairs = argsString.split(',').map((arg) => arg.trim())\n for (const argPair of argPairs) {\n const [argType, argName] = argPair.split(/\\s+/) as [string, string?]\n if (argName !== undefined) {\n tonArgs[argName.replace('$', '')] = argType\n tsArgs[argName.replace('$', '')] = tonTypeToTStype(argType)\n }\n }\n\n // parse the return type\n const tonReturnTypes = returnType\n .split(',')\n .map((type) => type.replace(/\\(/g, '').replace(/\\)/g, '').trim())\n const tsReturnTypes = tonReturnTypes.map((type) => tonTypeToTStype(type))\n\n if (!(contractName in viewFunctions)) {\n viewFunctions[contractName] = []\n }\n\n const fnName = snakeToCamelCase('get_' + name)\n\n const code = `\n static async ${fnName}(\n contract: ExtendedContract<TonContractWrapper>, \n ${Object.entries(tsArgs)\n .map(([argName, argType]) => `${argName}: ${argType}`)\n .join(', ')}\n ): Promise<[${tsReturnTypes.join(', ')}]> {\n const args: TupleItem[] = [\n ${Object.entries(tonArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(tonArgs).length > 0 ? argName : argName, argType)} }`\n )\n .join(',\\n ')}\n ]\n const stack = await contract.getViewFunction('${name}', args)\n return [\n ${tonReturnTypes\n .map((_, index) => `stack.${tonTypeToReadTupleFunction(tonReturnTypes[index])}`)\n .join(',\\n')}\n ]\n }\n `\n viewFunctions[contractName].push({\n name: fnName,\n args: tonArgs,\n returnType: tonReturnTypes,\n code,\n })\n }\n })\n })\n return viewFunctions\n}\n\nexport function saveViewFunctions(viewFunctions: TonViewFunctionsDict, directory: string, filename: string): void {\n const generatedFunctions = Object.entries(viewFunctions)\n .map(\n ([contractName, functions]) => `export class ${contractName} {\n ${functions.map((fn) => fn.code).join('\\n\\n')}\n }`\n )\n .join('\\n\\n')\n\n const savedCode = `${file_signature_header}\nimport { Address, Cell, Tuple, TupleItem, beginCell } from '@ton/core'\n\nimport { ExtendedContract, TonContractWrapper } from '../wrappers'\n\n${generatedFunctions}\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n","import {\n Address,\n Builder,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n SenderArguments,\n beginCell,\n} from '@ton/core'\n\nexport interface SendRequestOptions {\n value: number | bigint | string\n bounce?: boolean\n sendMode?: SendMode\n queryId?: number | bigint\n withInit?: boolean\n}\n\nexport abstract class BaseWrapper implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint | string): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n async sendRequest(provider: ContractProvider, via: Sender, request: SenderArguments): Promise<void> {\n return provider.internal(via, {\n value: request.value,\n sendMode: request.sendMode ?? undefined,\n body: request.body,\n bounce: request.bounce,\n })\n }\n\n async getDeployed(provider: ContractProvider): Promise<boolean> {\n const state = await provider.getState()\n return state.state.type !== 'uninit'\n }\n\n buildSenderArguments(body: Cell, opts: SendRequestOptions): SenderArguments {\n return {\n value: BigInt(opts.value),\n to: this.address,\n bounce: opts.bounce ?? true,\n body,\n init: opts.withInit === true ? this.init : undefined,\n sendMode: opts.sendMode ?? SendMode.PAY_GAS_SEPARATELY,\n } satisfies SenderArguments\n }\n\n beginMessage(opcode: number | bigint, queryId?: number | bigint): Builder {\n const randomQueryId = Math.floor(Math.random() * 100000000000)\n return beginCell()\n .storeUint(opcode, 32)\n .storeUint(queryId ?? randomQueryId, 64)\n }\n}\n","import fs from 'fs'\nimport path from 'path'\n\nexport function generateCommonTestUtils(directory: string, filename: string): void {\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} from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n ExtendedContract,\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n deconstructorMap,\n keyMap,\n} from '../../src'\n\nconst RECURSIVE_DECODE = false\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 SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n recursiveDecode?: boolean\n}\n\nexport interface SendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<TonContractWrapper | JettonMinter>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n recursiveDecode?: boolean\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 openAndDeployAllStorages(\n blockchain: Blockchain,\n multiSigOwner1: SandboxContract<TreasuryContract>\n): Promise<SandboxContract<TonContractWrapper>> {\n // ===================================open allStorages=====================================\n\n const allStorages = blockchain.openContract(\n TonContractWrapper.create(cellFromArtifact(AllStoragesArtifact), beginCell().endCell())\n )\n\n // ===================================deploy allStorages=====================================\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['AllStorages.INITIALIZE'],\n sender: multiSigOwner1.getSender(),\n contract: allStorages,\n expectedTransactions: [\n {\n from: multiSigOwner1.address,\n to: allStorages.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 return allStorages\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n recursiveDecode = RECURSIVE_DECODE,\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)\n .storeRef(targetContract.init.data)\n .endCell()\n\n rawMessageCell = rawMessageBuilder\n .storeUint(7, 108)\n .storeRef(targetContractStateInit)\n .storeRef(messageBody)\n .endCell()\n } else {\n rawMessageCell = rawMessageBuilder.storeUint(1, 107).storeRef(messageBody).endCell()\n }\n\n const orderMsg: TransferRequest = {\n type: 'transfer',\n sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE,\n message: rawMessageCell,\n }\n\n // one of the signers proposes deploying the controller\n let internalMsgResults = await multiSigContract.sendNewOrder(signers[0].getSender(), [orderMsg], curTime() + 100)\n\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: orderAddress,\n deploy: true,\n success: true,\n })\n\n // that makes sure that the target contract is a sandbox<TonContractWrapper>\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract) {\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).toHaveTransaction({\n from: orderAddress,\n to: multiSigContract.address,\n op: MultiSigOpCodes.multisig.execute,\n success: true,\n })\n\n // the multisig should deliver the message to the target contract\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract) {\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 = RECURSIVE_DECODE,\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) {\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 expect(actualTransactions).toHaveTransaction(tx)\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('../../src/offchain-helpers/allObjects') as { [key: string]: { [key: string]: any } }\n\n const typeName = await TonObjectUnwrapper.getTypeOf(contract, 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 TonObjectUnwrapper.getTypeOf(contract, 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): void {\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 } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n addMsgLibToController,\n emptyObject,\n protocolSetupGas,\n sendInternalMessageAndExpect,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\nimport { LzEventHandler, OPCODES, TonContractWrapper } from '../../src'\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): void {\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 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 { Profile, addressToBigInt, cellFromArtifact } 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 sendInternalMessageAndExpect,\n sendMessageViaMultisigAndExpect,\n serializeAddressList,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\nimport {\n ExtendedContract,\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n} from '../../src'\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): Promise<void> {\n requireDefined(sendDvnFixtures)\n requireDefined(receiveDvnFixtures)\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\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(DvnFeelibArtifact),\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 - 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\nconst decimalCount = 9\nconst decimal = pow10(decimalCount)\nconst defaultPath = 'gasInfo'\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface Profile {\n profileGas: boolean\n fileName: string\n filePath?: string\n}\n\nfunction createDirectoryIfNotExist(directoryPath: string): void {\n if (!fs.existsSync(directoryPath)) {\n fs.mkdirSync(directoryPath, { recursive: true })\n }\n}\n\nfunction sortAndSave(filePath: string, gasInfo: GasInfo): void {\n const entries = Object.entries(gasInfo)\n const sortedEntries = entries.sort(([, valueA], [, valueB]) => parseFloat(valueA) - parseFloat(valueB))\n const jsonData = JSON.stringify(Object.fromEntries(sortedEntries), null, 2)\n fs.writeFileSync(filePath, `${jsonData}\\n`, 'utf8')\n}\n\nfunction readOrCreateJsonFile(filePath: string): GasInfo {\n if (fs.existsSync(filePath)) {\n const fileContent: string = fs.readFileSync(filePath, 'utf8')\n return JSON.parse(fileContent) as GasInfo\n } else {\n return {}\n }\n}\n\nfunction pow10(n: number): bigint {\n let v = 1n\n for (let i = 0; i < n; i++) {\n v *= 10n\n }\n return v\n}\n\nexport function formatCoinsPure(value: bigint, precision = 6): string {\n let whole = value / decimal\n\n let frac = value % decimal\n const precisionDecimal = pow10(decimalCount - precision)\n if (frac % precisionDecimal > 0n) {\n // round up\n frac += precisionDecimal\n if (frac >= decimal) {\n frac -= decimal\n whole += 1n\n }\n }\n frac /= precisionDecimal\n\n return `${whole.toString()}${frac !== 0n ? '.' + frac.toString().padStart(precision, '0').replace(/0+$/, '') : ''}`\n}\n\nfunction formatCoins(value: bigint | undefined, precision = 6): string {\n if (value === undefined) return 'N/A'\n\n return formatCoinsPure(value, precision)\n}\n/**\n * Prints transaction fees.\n * Example output:\n * ```\n * ┌─────────┬───────────────────┬──────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────┬────────────────┬──────────┬────────────┐\n * │ (index) │ address │ op │ valueIn │ valueOut │ totalFees │ inForwardFee │ outForwardFee │ outActions │ computeFee │ exitCode │ actionCode │\n * ├─────────┼───────────────────┼──────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────┼────────────────┼──────────┼────────────┤\n * │ 0 │ 'lzDeployer' │ 'N/A' │ 'N/A' │ '1 TON' │ '0.002118 TON' │ 'N/A' │ '0.000818 TON' │ 1 │ '0.000775 TON' │ 0 │ 0 │\n * │ 1 │ 'counter' │ '0x14da9f4f' │ '1 TON' │ '0.994674 TON' │ '0.004814 TON' │ '0.000546 TON' │ '0.00077 TON' │ 1 │ '0.004558 TON' │ 0 │ 0 │\n * │ 2 │ 'endpointChannel' │ '0x24f8afd1' │ '0.994674 TON' │ '0.988235 TON' │ '0.005944 TON' │ '0.000513 TON' │ '0.000744 TON' │ 1 │ '0.005696 TON' │ 0 │ 0 │\n * │ 3 │ 'payload' │ '0x1b8fba43' │ '0.988235 TON' │ '0.983208 TON' │ '0.004437 TON' │ '0.000496 TON' │ '0.000885 TON' │ 1 │ '0.004142 TON' │ 0 │ 0 │\n * │ 4 │ 'counter' │ '0x507674bc' │ '0.983208 TON' │ '1.023606 TON' │ '0.00899 TON' │ '0.00059 TON' │ '0.000919 TON' │ 2 │ '0.008684 TON' │ 0 │ 0 │\n * │ 5 │ 'payload' │ '0x648a33b0' │ '0.049522 TON' │ '1.021254 TON' │ '0.002702 TON' │ '0.00032 TON' │ '0.00044 TON' │ 1 │ '0.002556 TON' │ 0 │ 0 │\n * │ 6 │ 'lzDeployer' │ 'no body' │ '0.974085 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * │ 7 │ 'lzDeployer' │ 'no body' │ '1.021254 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * └─────────┴───────────────────┴──────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────┴────────────────┴──────────┴────────────┘\n * ```\n */\n\nexport function printTransactionTrace(\n transactions: Transaction[],\n opcodeInfo: { [p: string]: string },\n callerStack?: string,\n profile?: Profile\n): void {\n const { stack } = new Error()\n callerStack ??= stack\n console.info(callerStack?.split('\\n')[2].trim())\n let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n if (profile?.profileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile.fileName}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n console.table(\n transactions\n .map((tx) => {\n if (tx.description.type !== 'generic') return undefined\n\n const body = tx.inMessage?.info.type === 'internal' ? tx.inMessage.body.beginParse() : undefined\n const op = body === undefined ? 0n : body.remainingBits >= 32 ? body.preloadUint(32) : 0n\n\n const totalFees = formatCoins(tx.totalFees.coins)\n\n const computeFees = formatCoins(\n tx.description.computePhase.type === 'vm' ? tx.description.computePhase.gasFees : undefined\n )\n\n const totalFwdFees = formatCoins(tx.description.actionPhase?.totalFwdFees ?? undefined)\n\n const valueIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.value.coins : undefined\n )\n\n const valueOut = formatCoins(\n tx.outMessages\n .values()\n .reduce(\n (total, message) =>\n total + (message.info.type === 'internal' ? message.info.value.coins : 0n),\n 0n\n )\n )\n\n const forwardIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.forwardFee : undefined\n )\n\n // remove 11 bits from front of tx.address\n const addressString =\n tx.address.toString(16).length != 64 ? 'UNKNOWN' : Address.parseRaw('1:' + tx.address.toString(16))\n const opString = op.toString() in opcodeInfo ? opcodeInfo[op.toString()] : op.toString()\n cumulativeFees += tx.totalFees.coins + (tx.description.actionPhase?.totalFwdFees ?? 0n)\n\n if (profile?.profileGas) gasInfo[opString] = formatCoins(cumulativeFees)\n\n return {\n address: addressString,\n op: opString,\n // valueIn,\n // valueOut,\n totalFees: totalFees,\n inForwardFee: forwardIn,\n outForwardFee: totalFwdFees,\n // outActions: tx.description.actionPhase?.totalActions ?? 'N/A',\n computeFee: computeFees,\n // exitCode: tx.description.computePhase.type === 'vm' ? tx.description.computePhase.exitCode : 'N/A',\n // actionCode: tx.description.actionPhase?.resultCode ?? 'N/A',\n cumulativeFee: formatCoins(cumulativeFees),\n }\n })\n .filter((v) => v !== undefined)\n )\n if (profile?.profileGas) sortAndSave(filePath, gasInfo)\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/sdk-tools.ts","../src/base-wrapper.ts","../src/test-tools.ts","../src/externalWrappers/Multisig-Constants.ts","../src/externalWrappers/Multisig.ts","../src/externalWrappers/Order.ts","../src/externalWrappers/multisig-utils.ts","../src/externalWrappers/jetton-helpers.ts","../src/externalWrappers/jetton-minter.ts","../src/externalWrappers/jetton-wallet.ts","../src/print-tx-trace.ts"],"names":["Cell","crc32","Address","toBigIntBE","toBufferBE","str","fs","path","name","SendMode","beginCell","Dictionary","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IAAM,mBAAmB,CAAC,EAAE,KAC/B,KAAAA,SAAA,CAAK,QAAQ,GAAG;AAIb,SAAS,aAAa,KAAuB,EAAA;AAChD,EAAA,OAAO,MAAa,CAAAC,gBAAA,CAAA,GAAA,CAAI,KAAK,CAAA,KAAM,CAAC,CAAA;AACxC;AAEO,IAAM,eAAkB,GAAA,CAAA;AACxB,IAAM,aAAgB,GAAA;AACtB,IAAM,kBAAqB,GAAA;AAE3B,SAAS,gBAAgB,KAAwB,EAAA;AACpD,EAAM,MAAA,GAAA,GAAM,eAAe,KAAK,CAAA;AAChC,EAAA,OAAOC,aAAQ,KAAM,CAAA,CAAA,EAAA,EAAK,IAAI,QAAS,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AACnD;AAEa,IAAA,eAAA,GAAkB,CAAC,OAA6B,KAAA;AACzD,EAAA,OAAO,OAAO,IAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACrD;AAOO,SAAS,cAAA,CAAe,KAA8C,EAAA,yBAAA,GAA4B,EAAY,EAAA;AACjH,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC3B,IAAI,IAAA,CAAC,UAAW,CAAA,KAAK,CAAG,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,8BAA8B,CAAA;AAAA;AAElD,IAAI,IAAA,GAAA,GAAM,OAAO,KAAK,CAAA;AACtB,IAAI,IAAA,GAAA,CAAI,MAAS,GAAA,CAAA,KAAM,CAAG,EAAA;AACtB,MAAA,GAAA,GAAM,GAAM,GAAA,GAAA;AAAA;AAEhB,IAAA,KAAA,GAAQC,uBAAW,CAAA,MAAA,CAAO,IAAK,CAAA,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA;AAE9C,EAAA,IAAI,iBAAiB,UAAY,EAAA;AAC7B,IAAA,KAAA,GAAQA,uBAAW,CAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAC,CAAA;AAAA;AAEzC,EAAA,MAAM,EAAK,GAAAC,uBAAA,CAAW,MAAO,CAAA,KAAK,GAAG,yBAAyB,CAAA;AAE9D,EAAO,OAAA,EAAA,CAAG,SAAS,CAAG,EAAA,CAAA;AAC1B;AAEA,SAAS,OAAOC,IAAqB,EAAA;AACjC,EAAOA,OAAAA,IAAAA,CAAI,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;AAChC;AAEA,SAAS,WAAWA,IAAsB,EAAA;AACtC,EAAA,MAAM,QAAW,GAAA,qBAAA;AACjB,EAAO,OAAA,QAAA,CAAS,KAAKA,IAAG,CAAA;AAC5B;AAEO,SAAS,gBAAgB,IAAsC,EAAA;AAElE,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,IAAK,CAAA,MAAA,EAAU,EAAA,CAAC,GAAG,CAAM,KAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,CAAC,CAAC,CAAA;AAG/E,EAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACnB,IAAO,OAAA,EAAE,cAAc,CAAE,EAAA;AAAA;AAG7B,EAAA,IAAI,IAAO,GAAA,CAAA;AAGX,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACpB,IAAA,IAAI,CAAC,GAAK,EAAA;AAEV,IAAQ,IAAA,IAAA,eAAA,CAAgB,GAAG,CAAE,CAAA,YAAA;AAAA;AAGjC,EAAO,OAAA,EAAE,cAAc,IAAK,EAAA;AAChC;;;ACjBA,IAAM,qBAAwB,GAAA,CAAA,wCAAA,CAAA;AAC9B,IAAM,cAAiB,GAAA,MAAA;AAEvB,SAAS,gBAAgB,OAAyB,EAAA;AAC9C,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,KAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,QAAA;AAAA,IAEX,KAAK,MAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,aAAA;AACD,MAAO,OAAA,MAAA;AAAA,IAEX,KAAK,OAAA;AACD,MAAO,OAAA,OAAA;AAAA,IAEX,KAAK,QAAA;AACD,MAAO,OAAA,MAAA;AAAA,IAEX,KAAK,OAAA;AACD,MAAO,OAAA,SAAA;AAAA,IAEX,KAAK,SAAA;AAAA,IACL,KAAK,YAAA;AACD,MAAO,OAAA,QAAA;AAAA,IAEX;AACI,MAAO,OAAA,SAAA;AAAA;AAEnB;AAEA,SAAS,2BAA2B,OAAyB,EAAA;AACzD,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,KAAA;AACD,MAAO,OAAA,iBAAA;AAAA,IAEX,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,eAAA;AAAA,IAEX,KAAK,MAAA;AACD,MAAO,OAAA,YAAA;AAAA,IAEX,KAAK,OAAA;AACD,MAAO,OAAA,4BAAA;AAAA,IAEX;AACI,MAAO,OAAA,OAAA;AAAA;AAEnB;AAEA,SAAS,uBAAuB,OAAyB,EAAA;AACrD,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AACD,MAAA,OAAO,aAAa,OAAU,GAAA,GAAA;AAAA,IAElC,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,kBAAA;AAAA,IAEX,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,cAAA;AACD,MAAO,OAAA,kBAAA;AAAA,IAEX,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,iBAAA;AAAA,IAEX,KAAK,SAAA;AAAA,IACL,KAAK,YAAA;AACD,MAAO,OAAA,kBAAA;AAAA,IAEX;AACI,MAAO,OAAA,SAAA;AAAA;AAEnB;AAEA,SAAS,oBAAA,CAAqB,MAAgB,EAAA,WAAA,GAAc,UAAoB,EAAA;AAC5E,EAAA,QAAQ,MAAQ;AAAA,IACZ,KAAK,QAAA;AACD,MAAA,OAAO,GAAG,WAAW,CAAA,SAAA,CAAA;AAAA,IAEzB,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAA,OAAO,GAAG,WAAW,CAAA,aAAA,CAAA;AAAA,IAEzB,KAAK,MAAA;AACD,MAAA,OAAO,GAAG,WAAW,CAAA,UAAA,CAAA;AAAA,IAEzB,KAAK,OAAA;AACD,MAAA,OAAO,GAAG,WAAW,CAAA,SAAA,CAAA;AAAA;AAAA,IAGzB,KAAK,QAAA;AACD,MAAO,OAAA,WAAA;AAAA,IAEX;AACI,MAAO,OAAA,SAAA;AAAA;AAEnB;AAEA,SAAS,mBAAmB,OAAyB,EAAA;AACjD,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AACD,MAAO,OAAA,KAAA;AAAA,IAEX,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACD,MAAO,OAAA,OAAA;AAAA,IAEX,KAAK,UAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,MAAA;AAAA,IAEX,KAAK,SAAA;AACD,MAAO,OAAA,OAAA;AAAA,IAEX;AACI,MAAO,OAAA,OAAA;AAAA;AAEnB;AAEA,SAAS,wBAAwB,OAAyB,EAAA;AACtD,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACD,MAAO,OAAA,OAAA;AAAA,IAEX,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,KAAA;AACD,MAAO,OAAA,MAAA;AAAA,IAEX,KAAK,OAAA;AACD,MAAO,OAAA,OAAA;AAAA,IAEX;AACI,MAAO,OAAA,OAAA;AAAA;AAEnB;AAEA,SAAS,mBAAA,CAAoB,OAAe,OAAyB,EAAA;AAEjE,EAAI,IAAA,KAAA,CAAM,QAAS,CAAA,gBAAgB,CAAG,EAAA;AAClC,IAAA,KAAA,GAAQ,MAAM,OAAQ,CAAA,gBAAA,EAAkB,EAAE,CAAE,CAAA,OAAA,CAAQ,WAAW,EAAE,CAAA;AAAA;AAErE,EAAA,QAAQ,OAAS;AAAA,IACb,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACD,MAAA,OAAO,4BAA4B,KAAK,CAAA,WAAA,CAAA;AAAA,IAE5C,KAAK,OAAA;AACD,MAAA,OAAO,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,IAEnB;AACI,MAAO,OAAA,KAAA;AAAA;AAEnB;AAEO,SAAS,qBAAA,CAAsB,QAAwB,KAAuC,EAAA;AACjG,EAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,CAAE,CAAA,OAAA;AAAA,IAClB,CAAC;AAAA,MACG,IAAA;AAAA,MACA;AAAA,QACI,oBAAsB,EAAA,SAAA;AAAA,QACtB,UAAA;AAAA,QACA,eAAiB,EAAA,YAAA;AAAA,QACjB,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AACJ,KACE,KAAA;AACF,MAAA,MAAA,CAAO,IAAI,CAAI,GAAA;AAAA,QACX,oBAAsB,EAAA,SAAA;AAAA,QACtB,UAAA;AAAA,QACA,eAAiB,EAAA,YAAA;AAAA,QACjB,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACJ;AAAA;AACJ,GACJ;AACA,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,eAAe,aAAuC,EAAA;AAClE,EAAA,IAAI,SAAyB,EAAC;AAE9B,EAAM,MAAA,KAAA,GAAWC,0BAAY,aAAa,CAAA;AAE1C,EAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACpB,IAAM,MAAA,QAAA,GAAgBC,eAAK,CAAA,IAAA,CAAA,aAAA,EAAe,IAAI,CAAA;AAC9C,IAAM,MAAA,KAAA,GAAWD,uBAAS,QAAQ,CAAA;AAElC,IAAI,IAAA,QAAA,CAAS,QAAS,CAAA,cAAc,CAAG,EAAA;AAIvC,IAAI,IAAA,KAAA,CAAM,aAAe,EAAA;AACrB,MAAA,MAAA,GAAS,qBAAsB,CAAA,MAAA,EAAQ,cAAe,CAAA,QAAQ,CAAC,CAAA;AAAA,KACxD,MAAA,IAAA,KAAA,CAAM,MAAO,EAAA,IAAUC,eAAQ,CAAA,OAAA,CAAA,IAAI,CAAM,KAAA,KAAA,IAAS,CAAC,QAAA,CAAS,QAAS,CAAA,UAAU,CAAG,EAAA;AACzF,MAAM,MAAA,OAAA,GAAaD,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,MAAM,CAAA;AAChD,MAAA,MAAA,GAAS,qBAAsB,CAAA,MAAA,EAAQ,YAAa,CAAA,OAAO,CAAC,CAAA;AAAA;AAChE,GACH,CAAA;AAED,EAAO,OAAA,MAAA;AACX;AAEA,SAAS,iBAAiBD,IAAqB,EAAA;AAC3C,EAAA,OAAOA,IACF,CAAA,OAAA,CAAQ,KAAO,EAAA,GAAG,CAClB,CAAA,OAAA,CAAQ,QAAU,EAAA,CAAC,KAAU,KAAA,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAC5D;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAiC,EAAA;AACvE,EAAA,MAAM,WAAwB,EAAC;AAC/B,EAAA,MAAM,gBAAmB,GAAA,sDAAA;AAEzB,EAAA,IAAI,GAAM,GAAA,CAAA;AAEV,EAAI,IAAA,KAAA;AACJ,EAAQ,OAAA,CAAA,KAAA,GAAQ,gBAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,MAAO,IAAQ,IAAA,GAAA,GAAM,MAAO,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAQ,EAAA;AAC1F,IAAA,MAAM,GAAG,OAAS,EAAA,aAAa,CAAI,GAAA,KAAA;AAEnC,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACV,MAAM,GAAO,IAAA,QAAA,GAAW,SAAS,GAAG,CAAA,CAAE,MAAS,GAAA,EAAA;AAAA,MAC/C,IAAA,EAAM,QAAQ,IAAK,EAAA,CAAE,MAAM,IAAI,CAAA,CAAE,KAAS,IAAA,KAAA;AAAA,MAC1C,KAAA,EAAO,cAAc,IAAK;AAAA,KAC7B,CAAA;AAED,IAAO,GAAA,IAAA,CAAA;AAAA;AAGX,EAAO,OAAA,QAAA;AACX;AAEA,SAAS,gBAAgB,QAA+C,EAAA;AACpE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,kBAAmC,EAAC;AAC1C,EAAA,MAAM,KAAQ,GAAA,2EAAA;AACd,EAAI,IAAA,KAAA;AAEJ,EAAA,IAAI,SAAY,GAAA,CAAA;AAChB,EAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAM,IAAK,CAAA,QAAQ,OAAO,IAAM,EAAA;AAC5C,IAAA,MAAM,GAAG,SAAW,EAAA,aAAa,CAAI,GAAA,KAAA;AACrC,IAAM,MAAA,UAAA,GAAa,QAAS,CAAA,aAAA,EAAe,EAAE,CAAA;AAC7C,IAAA,IAAI,eAAe,SAAW,EAAA;AAC1B,MAAA;AAAA;AAEJ,IAAA,QAAA,CAAS,UAAU,CAAI,GAAA,SAAA;AACvB,IAAA,eAAA,CAAgB,SAAS,CAAI,GAAA,UAAA;AAC7B,IAAA,SAAA,EAAA;AAAA;AAGJ,EAAO,OAAA,CAAC,UAAU,eAAe,CAAA;AACrC;AAEA,SAAS,aAAa,QAAkC,EAAA;AACpD,EAAA,MAAM,aACF,GAAA,oGAAA;AAEJ,EAAA,MAAM,UAA0B,EAAC;AAEjC,EAAI,IAAA,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAQ,GAAA,aAAA,CAAc,IAAK,CAAA,QAAQ,OAAO,IAAM,EAAA;AACpD,IAAA,MAAM,GAAG,OAAA,EAAS,gBAAgB,IAAI,CAAI,GAAA,KAAA;AAC1C,IAAA,MAAM,OAAkC,EAAC;AAGzC,IAAM,MAAA,QAAA,GAAW,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,IAAA,EAAM,CAAA;AAC9D,IAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC5B,MAAA,MAAM,CAAC,OAAS,EAAA,OAAO,CAAI,GAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAC9C,MAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACvB,QAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,GAAK,EAAA,EAAE,CAAC,CAAI,GAAA,OAAA;AAAA;AACrC;AAGJ,IAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,OAAQ,CAAA,QAAA,EAAU,EAAE,CAAA;AACzC,IAAM,MAAA,YAAA,GAAe,gBAAiB,CAAA,SAAA,GAAiB,IAAI,CAAA;AAE3D,IAAA,MAAM,CAAC,QAAA,EAAU,eAAe,CAAA,GAAI,gBAAgB,QAAQ,CAAA;AAE5D,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAW,QAAA,EAAA,IAAI,CAAK,GAAA,CAAA,CAAA;AAEhC,IAAA,MAAM,YAAe,GAAA,+CAAA;AACrB,IAAM,MAAA,YAAA,GAAe,QAAS,CAAA,KAAA,CAAM,YAAY,CAAA;AAChD,IAAA,MAAM,OAAU,GAAA,YAAA,GAAe,YAAa,CAAA,CAAC,CAAI,GAAA,IAAA;AAEjD,IAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,IAAA,EAAM,QAAQ,CAAA;AACnD,IAAA,OAAA,CAAQ,IAAI,CAAI,GAAA;AAAA,MACZ,oBAAsB,EAAA,IAAA;AAAA,MACtB,UAAA;AAAA,MACA,eAAiB,EAAA,YAAA;AAAA,MACjB,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACJ;AAAA;AAGJ,EAAO,OAAA,OAAA;AACX;AAEO,SAAS,oBAAA,CACZ,WACA,iBAAoB,GAAA,cAAA,EACpB,qBAAqB,YACrB,EAAA,4BAAA,GAA+B,sBAC/B,EAAA,4BAAA,GAA+B,sBAC3B,EAAA;AACJ,EAAA,MAAM,WAAW,CAAC,kBAAA,EAAoB,eAAe,IAAM,EAAA,SAAS,EAAE,IAAK,EAAA;AAC3E,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,yBAAA,EAQnB,iBAAiB,CAAA;;AAAA;AAAA,EAG1C,QAAS,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,MAAS,GAAA,IAAA,GAAO,KAAK,CAAA,CAAE,IAAK,CAAA,EAAE,CAAC,CAAA,QAAA,EAAW,kBAAkB,CAAA;;AAAA,oCAAA,EAE/C,4BAA4B,CAAA;AAAA,oCAAA,EAC5B,4BAA4B,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,CAAA;AA4F9D,EAAGC,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,qBAAqB,GAAG,SAAS,CAAA;AAC3E;AAEO,SAAS,kBACZ,CAAA,SAAA,EACA,kBAAqB,GAAA,YAAA,EACrB,6BAA6B,oBACzB,EAAA;AACJ,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA;AAAA;;AAAA;AAAA;;AAAA,kCAAA,EAOV,kBAAkB,CAAA;AAAA,2CAAA,EACT,0BAA0B,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,CAAA;AA4BnE,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,mBAAmB,GAAG,SAAS,CAAA;AACzE;AAEO,SAAS,mBAAA,CAAoB,WAAmB,WAA4B,EAAA;AAC/E,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC3B,IAAc,WAAA,GAAA,CAAA,8EAAA,CAAA;AAAA;AAElB,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAe5C,WAAW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;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;AAiJT,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,oBAAoB,GAAG,SAAS,CAAA;AAC1E;AAEO,SAAS,sBACZ,CAAA,UAAA,EACA,SACA,EAAA,yBAAA,GAA4B,mBACxB,EAAA;AACJ,EAAA,MAAM,mBAAmB,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAA,CAC7C,IAAI,CAAC,CAAC,CAAG,EAAA,SAAS,MAAM,SAAU,CAAA,eAAA,IAAmB,EAAE,CAAA,CACvD,KAAK,IAAI,CAAA;AAEd,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,iCAAA,EAeX,yBAAyB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,IAAA,EAkBtD,gBAAgB;AAAA;AAAA,CAAA;AAIlB,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,uBAAuB,GAAG,SAAS,CAAA;AAC7E;AAEO,SAAS,YACZ,CAAA,UAAA,EACA,SACA,EAAA,4BAAA,GAA+B,sBAC3B,EAAA;AACJ,EAAA,MAAM,cAAiB,GAAA,MAAA,CAAO,OAAQ,CAAA,UAAU,CAC3C,CAAA,MAAA,CAAO,CAAC,CAAC,CAAG,EAAA,SAAS,CAAM,KAAA,SAAA,CAAU,UAAW,CAAA,MAAA,GAAS,CAAC,CAAA,CAC1D,GAAI,CAAA,CAAC,CAAC,CAAA,EAAG,SAAS,CAAA,KAAM,SAAa,IAAA,SAAA,CAAU,UAAc,IAAA,EAAA,CAAG,CAChE,CAAA,IAAA,CAAK,EAAE,CAAA;AAEZ,EAAA,MAAM,UAAuC,EAAC;AAC9C,EAAA,MAAM,aAAwC,EAAC;AAC/C,EAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,IAAI,CAAM,KAAA;AAChD,IAAI,IAAA,IAAA,CAAK,eAAe,KAAW,CAAA,EAAA;AAC/B,MAAA;AAAA;AAEJ,IAAI,IAAA,EAAE,IAAK,CAAA,OAAA,IAAW,OAAU,CAAA,EAAA;AAC5B,MAAQ,OAAA,CAAA,IAAA,CAAK,OAAO,CAAA,GAAI,EAAC;AAAA;AAE7B,IAAA,OAAA,CAAQ,IAAK,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AAC1C,IAAW,UAAA,CAAA,IAAA,CAAK,OAAO,CAAI,GAAA,GAAA;AAAA,GAC9B,CAAA;AACD,EAAA,MAAM,iBAAoB,GAAA;AAAA;AAAA,QAEpB,EAAA,MAAA,CAAO,QAAQ,OAAO,CAAA,CACnB,IAAI,CAAC,CAAC,KAAK,GAAG,CAAA,KAAM,UAAU,GAAM,GAAA,MAAA,GAAS,IAAI,CAAC,CAAA,GAAI,IAAI,CAC1D,CAAA,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,QAAA,EAIb,OAAO,OAAQ,CAAA,UAAU,EACtB,GAAI,CAAA,CAAC,CAAC,GAAK,EAAA,GAAG,CAAM,KAAA,OAAA,GAAU,MAAM,MAAS,GAAA,GAAA,GAAM,IAAI,CACvD,CAAA,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,IAAA,CAAA;AAInB,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA;;AAAA;AAAA;;AAAA,oCAAA,EAMR,4BAA4B,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,EAuChE,cAAc;;AAAA,EAEd,iBAAiB;AAAA,CAAA;AAGf,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,aAAa,GAAG,SAAS,CAAA;AACnE;AAEO,SAAS,gBAAA,CAAiB,SAAmB,EAAA,iBAAA,GAAoB,cAAsB,EAAA;AAC1F,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,yBAAA,EAQnB,iBAAiB,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,CAAA,CAAA;AAuHxC,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,iBAAiB,GAAG,SAAS,CAAA;AACvE;AAEO,SAAS,uBACZ,UACA,EAAA,SAAA,EACA,kBAAqB,GAAA,YAAA,EACrB,+BAA+B,sBAC3B,EAAA;AACJ,EAAA,MAAM,QAAW,GAAA;AAAA,IACb,GAAI,MAAA,CAAO,MAAO,CAAA,UAAU,EACvB,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,UAAU,CAC3B,CAAA,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,KAAS,CAAA,CAAA;AAAA,IACxC,kBAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,IACF,IAAK,EAAA;AACP,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,EAS5C,QAAS,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,MAAS,GAAA,IAAA,GAAO,KAAK,CAAA,CAAE,IAAK,CAAA,EAAE,CAAC,CAAA,QAAA,EAAW,kBAAkB,CAAA;AAAA,oCAAA,EAC/C,4BAA4B,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhE,KAAM,CAAA,IAAA;AAAA,IACJ,IAAI,GAAA;AAAA,MACA,MAAA,CAAO,OAAQ,CAAA,UAAU,CACpB,CAAA,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,WAAW,CAAA,KAAM,WAAY,CAAA,iBAAiB,EAC1D,GAAI,CAAA,CAAC,CAAC,CAAA,EAAG,WAAW,CAAA,KAAM,CAAC,WAAY,CAAA,OAAA,EAAS,WAAY,CAAA,iBAAiB,CAAC;AAAA,MACrF,MAAO;AAAA,GACb,CAAE,IAAK,CAAA,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA,IAAA,EAKN,KAAM,CAAA,IAAA;AAAA,IACJ,IAAI,GAAA;AAAA,MACA,MAAA,CAAO,OAAQ,CAAA,UAAU,CACpB,CAAA,MAAA;AAAA,QACG,CAAC,CAAC,CAAG,EAAA,WAAW,MACZ,WAAY,CAAA,iBAAA,IAAqB,IACjC,IAAA,WAAA,CAAY,sBAAsB,EAClC,IAAA,WAAA,CAAY,iBAAqB,IAAA,IAAA,IACjC,YAAY,iBAAsB,KAAA;AAAA,OAEzC,CAAA,GAAA,CAAI,CAAC,CAAC,CAAG,EAAA,WAAW,CAAM,KAAA,CAAC,WAAY,CAAA,OAAA,EAAS,WAAY,CAAA,iBAAiB,CAAC;AAAA;AACvF,GAEC,CAAA,GAAA,CAAI,CAAC,CAAC,SAAS,iBAAiB,CAAA,KAAM,CAAG,EAAA,OAAO,wBAAwB,iBAAiB,CAAA,CAAA,CAAG,CAC5F,CAAA,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAGf,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,uBAAuB,GAAG,SAAS,CAAA;AAC7E;AAEO,SAAS,uBAAA,CAAwB,WAAmB,UAA4C,EAAA;AACnG,EAAI,IAAA,EAAE,aAAa,UAAa,CAAA,EAAA;AAC5B,IAAO,OAAA,UAAA;AAAA;AAGX,EAAM,MAAA,QAAA,GAAW,WAAW,SAAS,CAAA;AACrC,EAAM,MAAA,EAAE,oBAAsB,EAAA,SAAA,EAAc,GAAA,QAAA;AAE5C,EAAA,MAAM,MAAS,GAAA,gBAAA,CAAiB,CAAU,OAAA,EAAA,SAAS,CAAE,CAAA,CAAA;AAErD,EAAI,IAAA,YAAA,GAAe,GAAG,SAAS,CAAA,KAAA,CAAA;AAC/B,EAAI,IAAA,SAAA,CAAU,QAAS,CAAA,OAAO,CAAG,EAAA;AAC7B,IAAe,YAAA,GAAA,SAAA;AAAA;AAGnB,EAAA,QAAA,CAAS,eAAkB,GAAA,MAAA;AAE3B,EAAA,QAAA,CAAS,eAAkB,GAAA;AAAA,cAAA,EACf,MAAM,CACV,2BAAA,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA,CAAE,SAAS,CAC1B,GAAA,CAAA;AAAA,SACP,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA,CACrB,IAAI,CAAC,CAAC,SAAS,OAAO,CAAA,KAAM,GAAG,OAAO,CAAA,EAAA,EAAK,gBAAgB,OAAO,CAAC,EAAE,CACrE,CAAA,IAAA,CAAK,SAAS,CAAC;AAAA,aAAA,CAAA,GAEX,EACV,CAAA;AAAA,kDAAA,EAC4C,YAAY,CAAA;AAAA,YAClD,EAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CACrB,CAAA,GAAA;AAAA,IACG,CAAC,CAAC,OAAA,EAAS,OAAO,CAAA,KACd,CAAY,SAAA,EAAA,kBAAA,CAAmB,OAAO,CAAC,CAAM,GAAA,EAAA,uBAAA,CAAwB,OAAO,CAAC,KAAK,mBAAoB,CAAA,MAAA,CAAO,IAAK,CAAA,SAAS,CAAE,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,GAAK,OAAS,EAAA,OAAO,CAAC,CAAA,EAAA;AAAA,GACvL,CACC,IAAK,CAAA,SAAS,CAAC;AAAA;AAAA;AAAA,KAAA,CAAA;AAK5B,EAAS,QAAA,CAAA,4BAAA,GAA+B,CAAC,UAAA,EAA6B,CAAc,KAAA;AAEhF,IAAM,MAAA,WAAA,GAAc,MAAO,CAAA,IAAA,CAAK,SAAS,CAAA,CAAE,OAAO,CAAC,GAAA,KAAQ,EAAE,GAAA,IAAO,UAAW,CAAA,CAAA;AAC/E,IAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACxB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACJ,CAA6B,0BAAA,EAAA,WAAA,CAAY,IAAK,CAAA,IAAI,CAAC,CAAA,sEAAA;AAAA,OACvD;AAAA;AAGJ,IAAA,MAAM,YAAe,GAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA,CAAO,CAAC,CAAC,GAAK,EAAA,KAAK,CAAM,KAAA,GAAA,IAAO,UAAU,CAAA;AAEzF,IAAO,OAAA,CAAA,MAAA,EAAS,MAAM,CAAA,qBAAA,EAClB,YAAa,CAAA,MAAA,GAAS,IAChB,CAAO,IAAA,EAAA,YAAA,CAAa,GAAI,CAAA,CAAC,CAAC,OAAA,EAAS,OAAO,CAAM,KAAA,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,EAAE,IAAK,CAAA,IAAI,CAAC,CAAA,EAAA,CAAA,GACpF,EACV,CAAA,CAAA,CAAA;AAAA,GACJ;AAEA,EAAA,UAAA,CAAW,SAAS,CAAI,GAAA,QAAA;AACxB,EAAO,OAAA,UAAA;AACX;AAEO,SAAS,4BAA4B,UAA4C,EAAA;AACpF,EAAA,KAAA,MAAW,CAAC,SAAW,EAAA,QAAQ,KAAK,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAG,EAAA;AAC5D,IAAA,uBAAA,CAAwB,WAAW,UAAU,CAAA;AAAA;AAEjD,EAAO,OAAA,UAAA;AACX;AAEA,SAAS,mBAAmB,IAAsB,EAAA;AAC9C,EAAA,IAAI,YAAe,GAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAA;AAC1C,EAAM,MAAA,MAAA,GAAS,YAAa,CAAA,OAAA,CAAQ,KAAK,CAAA;AACzC,EAAA,IAAI,WAAW,CAAI,CAAA,EAAA;AACf,IAAe,YAAA,GAAA,YAAA,CAAa,SAAU,CAAA,MAAA,GAAS,CAAC,CAAA;AAAA;AAEpD,EAAO,OAAA,YAAA;AACX;AAEO,SAAS,oBAAA,CAAqB,MAAc,UAA4C,EAAA;AAC3F,EAAI,IAAA,EAAE,QAAQ,UAAa,CAAA,EAAA;AACvB,IAAO,OAAA,UAAA;AAAA;AAEX,EAAM,MAAA,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,EAAM,MAAA,eAAA,GAAkB,gBAAiB,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAM,CAAE,CAAA,WAAA,EAAa,CAAA;AACnF,EAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAK,WAAY,EAAA,CAAE,WAAW,IAAI,CAAA;AACnD,EAAM,MAAA,QAAA,GAAW,QAAS,CAAA,KAAA,GAAQ,WAAc,GAAA,MAAA;AAChD,EAAM,MAAA,SAAA,GAAY,QAAS,CAAA,KAAA,GAAQ,YAAe,GAAA,GAAA;AAClD,EAAA,QAAA,CAAS,aACL,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,eAAe,IAAI,SAAS,CAAA;AAAA,QACzC,EAAA,QAAA,CAAS,WACN,GAAI,CAAA,CAAC,EAAE,IAAAC,EAAAA,KAAAA,EAAM,MAAW,KAAA;AACrB,IAAA,OAAO,GAAG,kBAAmBA,CAAAA,KAAI,CAAC,CAAK,EAAA,EAAA,eAAA,CAAgB,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,GAC/D,CAAA,CACA,IAAK,CAAA,IAAI,CAAC;AAAA;;AAAA,CAAA;AAGnB,EAAA,QAAA,CAAS,UAAa,GAAA,eAAA;AACtB,EAAA,UAAA,CAAW,IAAI,CAAI,GAAA,QAAA;AACnB,EAAO,OAAA,UAAA;AACX;AAEO,SAAS,yBAAyB,UAA4C,EAAA;AACjF,EAAA,KAAA,MAAW,CAAC,SAAW,EAAA,QAAQ,KAAK,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAG,EAAA;AAC5D,IAAA,oBAAA,CAAqB,WAAW,UAAU,CAAA;AAAA;AAE9C,EAAO,OAAA,UAAA;AACX;AAEO,SAAS,yBAAA,CAA0B,WAAmB,UAA4C,EAAA;AACrG,EAAI,IAAA,EAAE,aAAa,UAAa,CAAA,EAAA;AAC5B,IAAO,OAAA,UAAA;AAAA;AAEX,EAAM,MAAA,QAAA,GAAW,WAAW,SAAS,CAAA;AACrC,EAAA,MAAM,EAAE,UAAA,EAAY,UAAY,EAAA,eAAA,EAAoB,GAAA,QAAA;AACpD,EAAA,MAAM,MAAS,GAAA,gBAAA,CAAiB,MAAS,GAAA,SAAA,GAAY,MAAM,CAAA;AAE3D,EAAA,QAAA,CAAS,iBAAoB,GAAA,MAAA;AAC7B,EAAA,QAAA,CAAS,iBAAoB,GAAA;AAAA,qBACV,EAAA,MAAM,yEAAyE,UAAU,CAAA;AAAA,YAAA,EAClG,WACG,GAAI,CAAA,CAAC,EAAE,IAAA,EAAM,MAAW,KAAA;AACrB,IAAM,MAAA,WAAA,GAAc,mBAAmB,IAAI,CAAA;AAC3C,IAAA,MAAM,YAAe,GAAA,oBAAA,CAAqB,eAAgB,CAAA,IAAI,GAAG,SAAS,CAAA;AAC1E,IAAM,MAAA,UAAA,GAAa,gBAAgB,IAAI,CAAA;AAEvC,IAAM,MAAA,aAAA,GAAgB,uBAAuB,IAAI,CAAA;AACjD,IAAA,IAAI,iBAAiB,WAAa,EAAA;AAC9B,MAAO,OAAA,CAAA,MAAA,EAAS,WAAW,CAAA,yBAAA,EAA4B,UAAU,CAAA,WAAA,CAAA;AAAA,KACrE,MAAA,IAAW,iBAAiB,kBAAoB,EAAA;AAC5C,MAAA,OAAO,SAAS,WAAW,CAAA,SAAA,EAAY,YAAY,CAAK,EAAA,EAAA,aAAa,YAAY,UAAU,CAAA,EAAA,CAAA;AAAA,KACxF,MAAA;AACH,MAAA,OAAO,CAAS,MAAA,EAAA,WAAW,CAAY,SAAA,EAAA,YAAY,UAAU,UAAU,CAAA,EAAA,CAAA;AAAA;AAC3E,GACH,CAAA,CACA,IAAK,CAAA,IAAI,CAAC;AAAA;AAAA,YAAA,EAEb,UAAW,CAAA,GAAA,CAAI,CAAC,EAAE,MAAW,KAAA,CAAA,EAAG,kBAAmB,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA,KAAA,CAAA;AAKrF,EAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AACzB,IAAA,QAAA,CAAS,iBAAoB,GAAA,EAAA;AAAA;AAGjC,EAAS,QAAA,CAAA,8BAAA,GAAiC,CAAC,UAAA,EAA6B,CAAc,KAAA;AAClF,IAAA,OAAO,SAAS,MAAM,CAAA,eAAA,CAAA;AAAA,GAC1B;AAEA,EAAA,UAAA,CAAW,SAAS,CAAI,GAAA,QAAA;AACxB,EAAO,OAAA,UAAA;AACX;AAEO,SAAS,8BAA8B,UAA4C,EAAA;AACtF,EAAA,KAAA,MAAW,CAAC,SAAW,EAAA,QAAQ,KAAK,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAG,EAAA;AAC5D,IAAA,yBAAA,CAA0B,WAAW,UAAU,CAAA;AAAA;AAEnD,EAAO,OAAA,UAAA;AACX;AAEO,SAAS,gBAAA,CAAiB,SAAiB,WAA+B,EAAA;AAC7E,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,SAAS,YAAY,WAA2B,EAAA;AAC5C,IAAA,MAAM,UAAaF,aAAY,CAAA,WAAA,CAAA,WAAA,EAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AACzB,MAAA,MAAM,QAAgB,GAAAC,eAAA,CAAA,IAAA,CAAK,WAAa,EAAA,KAAA,CAAM,IAAI,CAAA;AAElD,MAAI,IAAA,KAAA,CAAM,aAAe,EAAA;AACrB,QAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,OACxB,MAAA,IACI,MAAM,MAAO,EAAA,IACb,MAAM,IAAK,CAAA,WAAA,GAAc,QAAS,CAAA,WAAW,MACvCA,eAAQ,CAAA,OAAA,CAAA,KAAA,CAAM,IAAI,CAAM,KAAA,KAAA,IAAcA,wBAAQ,KAAM,CAAA,IAAI,MAAM,OACtE,CAAA,EAAA;AACE,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA;AACvB;AACJ;AAGJ,EAAA,WAAA,CAAY,OAAO,CAAA;AACnB,EAAO,OAAA,KAAA;AACX;AAEO,SAAS,eAAA,CAAgB,UAA4B,EAAA,QAAA,EAAkB,QAAwB,EAAA;AAClG,EAAI,IAAA,MAAA,GAAS,GAAG,qBAAqB;;AAAA;AAAA,CAAA;AAErC,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAG,EAAA;AACnD,IAAA,MAAA,IAAU,MAAM,GAAG,CAAA;AAAA,WAAA,EAAoB,MAAM,OAAO,CAAA;AAAA,CAAA;AAEpD,IAAW,KAAA,MAAA,SAAA,IAAa,MAAM,UAAY,EAAA;AACtC,MAAA,MAAM,MAAS,GAAA,KAAA,CAAM,eAAgB,CAAA,SAAA,CAAU,IAAI,CAAA;AACnD,MAAA,MAAA,IAAU,OAAO,MAAM,CAAA;AAAA,CAAA;AACvB,MAAA,MAAA,IAAU,CAAqB,kBAAA,EAAA,GAAG,CAAK,EAAA,EAAA,SAAA,CAAU,IAAI,CAAA;AAAA,CAAA;AACrD,MAAU,MAAA,IAAA,CAAA,yBAAA,EAA4B,UAAU,IAAI,CAAA;AAAA,CAAA;AACpD,MAAU,MAAA,IAAA,CAAA;AAAA,CAAA;AAAA;AAGd,IAAU,MAAA,IAAA,CAAA;AAAA,CAAA;AAAA;AAGd,EAAU,MAAA,IAAA,CAAA;AAAA,CAAA;AAGV,EAAGD,4BAAmBC,eAAQ,CAAA,OAAA,CAAA,QAAA,EAAU,QAAQ,CAAA,EAAG,QAAQ,MAAM,CAAA;AACrE;AAEA,SAAS,qBAAqB,IAAsB,EAAA;AAChD,EAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAA;AAClC;AAEO,SAAS,eAAe,SAA0C,EAAA;AACrE,EAAA,MAAM,WAAc,GAAA,yEAAA;AACpB,EAAA,MAAM,YAAe,GAAA,+EAAA;AACrB,EAAA,MAAM,WAAc,GAAA,sDAAA;AACpB,EAAA,MAAM,YAAe,GAAA,2EAAA;AACrB,EAAA,MAAM,WAAc,GAAA,2EAAA;AAEpB,EAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA;AACvC,EAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAC9B,IAAM,MAAA,WAAA,GAAiBD,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,OAAO,CAAA;AACrD,IAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACtB,MAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA;AAC9B,MAAA,IAAI,eAAkB,GAAA,EAAA;AACtB,MAAA,IAAI,QAAW,GAAA,EAAA;AACf,MAAA,IAAI,KAAQ,GAAA,EAAA;AAEZ,MAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAA;AACtD,MAAM,MAAA,iBAAA,GAAoB,WAAY,CAAA,KAAA,CAAM,YAAY,CAAA;AACxD,MAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAA;AACtD,MAAM,MAAA,iBAAA,GAAoB,WAAY,CAAA,KAAA,CAAM,YAAY,CAAA;AACxD,MAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAA;AACtD,MAAA,IAAI,gBAAkB,EAAA;AACjB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,gBAAA;AACjC,QAAA,KAAA,GAAQ,aAAa,QAAQ,CAAA;AAAA,iBACtB,iBAAmB,EAAA;AACzB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,iBAAA;AACjC,QAAA,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAAA,iBAChB,gBAAkB,EAAA;AACxB,QAAA,KAAK,eAAiB,IAAE,QAAQ,CAAI,GAAA,gBAAA;AACrC,QAAA,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAAA,iBAChB,iBAAmB,EAAA;AACzB,QAAA,GAAG,eAAA,IAAmB,QAAQ,CAAI,GAAA,iBAAA;AACnC,QAAA,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAAA,iBAChB,gBAAkB,EAAA;AACxB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,gBAAA;AACjC,QAAA,KAAA,GAAQ,aAAa,QAAQ,CAAA;AAAA;AAGjC,MAAI,IAAA,eAAA,KAAoB,EAAM,IAAA,QAAA,KAAa,EAAI,EAAA;AAC3C,QAAA,MAAA,CAAO,GAAI,CAAA,oBAAA,CAAqB,eAAe,CAAA,EAAG,KAAK,CAAA;AAAA;AAC3D;AACJ;AAEJ,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,cAAc,SAA0C,EAAA;AACpE,EAAA,MAAM,WACF,GAAA,+GAAA;AACJ,EAAA,MAAM,YAAe,GAAA,kEAAA;AACrB,EAAA,MAAM,WAAc,GAAA,8DAAA;AAEpB,EAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA;AACvC,EAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAC9B,IAAM,MAAA,WAAA,GAAiBA,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,OAAO,CAAA;AACrD,IAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACtB,MAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA;AAC9B,MAAA,IAAI,eAAkB,GAAA,EAAA;AACtB,MAAA,IAAI,QAAW,GAAA,EAAA;AACf,MAAA,IAAI,KAAQ,GAAA,EAAA;AAEZ,MAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAA;AACtD,MAAM,MAAA,iBAAA,GAAoB,WAAY,CAAA,KAAA,CAAM,YAAY,CAAA;AACxD,MAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAA;AACtD,MAAA,IAAI,gBAAkB,EAAA;AACjB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,gBAAA;AACjC,QAAQ,KAAA,GAAA,YAAA,CAAa,QAAQ,CAAI,GAAA,cAAA;AAAA,iBAC1B,iBAAmB,EAAA;AACzB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,iBAAA;AACjC,QAAQ,KAAA,GAAA,MAAA,CAAO,QAAQ,CAAI,GAAA,cAAA;AAAA,iBACpB,gBAAkB,EAAA;AACxB,QAAC,GAAE,eAAiB,EAAA,QAAQ,CAAI,GAAA,gBAAA;AACjC,QAAQ,KAAA,GAAA,MAAA,CAAO,QAAQ,CAAI,GAAA,cAAA;AAAA;AAG/B,MAAI,IAAA,eAAA,KAAoB,EAAM,IAAA,QAAA,KAAa,EAAI,EAAA;AAC3C,QAAA,MAAA,CAAO,GAAI,CAAA,oBAAA,CAAqB,eAAe,CAAA,EAAG,KAAK,CAAA;AAAA;AAC3D;AACJ;AAEJ,EAAO,OAAA,MAAA;AACX;AAEA,SAAS,oBAAoBD,IAAqB,EAAA;AAC9C,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAIA,GAAAA,IAAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AACjC,IAAA,MAAA,GAAU,UAAU,EAAM,GAAA,MAAA,CAAOA,IAAI,CAAA,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA;AAEtD,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,cAAc,SAAoD,EAAA;AAE9E,EAAA,MAAM,WAAc,GAAA,mFAAA;AAEpB,EAAA,MAAM,YAAe,GAAA,+DAAA;AAErB,EAAM,MAAA,MAAA,uBAAa,GAA8B,EAAA;AACjD,EAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAC9B,IAAM,MAAA,WAAA,GAAiBC,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,OAAO,CAAA;AACrD,IAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACtB,MAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA;AAC9B,MAAA,IAAI,SAAY,GAAA,EAAA;AAChB,MAAA,IAAI,WAAc,GAAA,EAAA;AAGlB,MAAA,MAAM,mBAAmB,WAAY,CAAA,KAAA,CAAM,WAAW,CAAK,IAAA,WAAA,CAAY,MAAM,YAAY,CAAA;AACzF,MAAA,IAAI,gBAAkB,EAAA;AACjB,QAAC,GAAE,SAAW,EAAA,WAAW,CAAI,GAAA,gBAAA;AAC9B,QAAO,MAAA,CAAA,GAAA,CAAI,qBAAqB,SAAS,CAAA,EAAG,CAAC,WAAa,EAAA,mBAAA,CAAoB,WAAW,CAAC,CAAC,CAAA;AAAA;AAC/F;AACJ;AAEJ,EAAO,OAAA,MAAA;AACX;AAEO,SAAS,cACZ,CAAA,MAAA,EACA,SACA,EAAA,YAAA,EACA,QACI,EAAA;AACJ,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA,aAAA,EAC/B,YAAY,CAAA;AAAA,EACzB,KAAA,CAAM,IAAK,CAAA,MAAA,CAAO,OAAQ,EAAC,EACxB,GAAI,CAAA,CAAC,CAAC,GAAA,EAAK,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA,KAAM,CAAK,EAAA,EAAA,GAAG,CAAoB,iBAAA,EAAA,QAAQ,CAAgB,aAAA,EAAA,QAAQ,CAAK,GAAA,CAAA,CAAA,CACtG,IAAK,CAAA,IAAI,CAAC;AAAA;AAAA,CAAA;AAIX,EAAGA,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,iBACZ,CAAA,SAAA,EACA,SACA,EAAA,YAAA,EACA,QACI,EAAA;AACJ,EAAM,MAAA,SAAA,GAAY,GAAG,qBAAqB;AAAA,aAAA,EAC/B,YAAY,CAAA;AAAA,EACzB,KAAA,CAAM,KAAK,SAAU,CAAA,OAAA,EAAS,CAC3B,CAAA,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA,CAAA,IAAA,EAAO,GAAG,CAAK,EAAA,EAAA,KAAK,IAAI,CAC9C,CAAA,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAIX,EAAGD,aAAmB,CAAA,aAAA,CAAAC,eAAA,CAAA,IAAA,CAAK,SAAW,EAAA,QAAQ,GAAG,SAAS,CAAA;AAC9D;AAEO,SAAS,wBAAA,CACZ,OACA,EAAA,aAAA,EACA,SACoB,EAAA;AACpB,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,gBAAsC,EAAC;AAG7C,EAAA,SAAS,iBAAiB,GAAmB,EAAA;AACzC,IAAA,MAAM,UAAaD,aAAY,CAAA,WAAA,CAAA,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE3D,IAAA,MAAM,iBAAoB,GAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,KAAU,KAAA,CAAC,KAAM,CAAA,WAAA,EAAiB,IAAA,aAAA,CAAc,QAAS,CAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AAE5G,IAAI,IAAA,iBAAA,IAAqB,CAAC,SAAA,CAAU,IAAK,CAAA,CAAC,SAAS,GAAI,CAAA,QAAA,CAAS,IAAI,CAAC,CAAG,EAAA;AACpE,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA;AAGzB,IAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACvB,MAAI,IAAA,KAAA,CAAM,aAAe,EAAA;AACrB,QAAA,gBAAA,CAAsBC,eAAK,CAAA,IAAA,CAAA,GAAA,EAAK,KAAM,CAAA,IAAI,CAAC,CAAA;AAAA;AAC/C,KACH,CAAA;AAAA;AAGL,EAAA,gBAAA,CAAiB,OAAO,CAAA;AAGxB,EAAA,KAAA,MAAW,OAAO,YAAc,EAAA;AAC5B,IAAA,MAAM,KAAW,GAAAD,aAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA,IAAK,IAAK,CAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AAEjG,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACtB,MAAM,MAAA,QAAA,GAAgBC,eAAK,CAAA,IAAA,CAAA,GAAA,EAAK,IAAI,CAAA;AACpC,MAAM,MAAA,YAAA,GAAe,gBAAsB,CAAAA,eAAA,CAAA,QAAA,CAAcA,eAAQ,CAAA,OAAA,CAAA,GAAG,CAAC,CAAI,GAAA,GAAA,GAAWA,eAAS,CAAA,QAAA,CAAA,GAAG,CAAC,CAAA;AACjG,MAAM,MAAA,OAAA,GAAaD,aAAa,CAAA,YAAA,CAAA,QAAA,EAAU,OAAO,CAAA;AAEjD,MAAA,MAAM,aACF,GAAA,0HAAA;AACJ,MAAI,IAAA,KAAA;AAEJ,MAAA,OAAA,CAAQ,KAAQ,GAAA,aAAA,CAAc,IAAK,CAAA,OAAO,OAAO,IAAM,EAAA;AACnD,QAAA,MAAM,GAAG,UAAY,EAAA,IAAA,EAAM,UAAU,CAAI,GAAA,KAAA;AAEzC,QAAI,IAAA,IAAA,CAAK,QAAS,CAAA,OAAO,CAAG,EAAA;AACxB,UAAA;AAAA;AAEJ,QAAA,MAAM,UAAqC,EAAC;AAC5C,QAAA,MAAM,SAAoC,EAAC;AAE3C,QAAM,MAAA,QAAA,GAAW,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,IAAA,EAAM,CAAA;AAC9D,QAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC5B,UAAA,MAAM,CAAC,OAAS,EAAA,OAAO,CAAI,GAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAC9C,UAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACvB,YAAA,OAAA,CAAQ,OAAQ,CAAA,OAAA,CAAQ,GAAK,EAAA,EAAE,CAAC,CAAI,GAAA,OAAA;AACpC,YAAA,MAAA,CAAO,QAAQ,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAC,CAAA,GAAI,gBAAgB,OAAO,CAAA;AAAA;AAC9D;AAIJ,QAAA,MAAM,iBAAiB,UAClB,CAAA,KAAA,CAAM,GAAG,CACT,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAE,MAAM,CAAA;AACpE,QAAA,MAAM,gBAAgB,cAAe,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,eAAA,CAAgB,IAAI,CAAC,CAAA;AAExE,QAAI,IAAA,EAAE,gBAAgB,aAAgB,CAAA,EAAA;AAClC,UAAc,aAAA,CAAA,YAAY,IAAI,EAAC;AAAA;AAGnC,QAAA,MAAM,YAAe,GAAA;AAAA,UACjB,gDAAA;AAAA,UACA,GAAG,MAAO,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAI,SAAU,CAAC,OAAS,EAAA,OAAO,CAAG,EAAA;AACxD,YAAO,OAAA,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,WAChC;AAAA,SACL;AAEA,QAAM,MAAA,MAAA,GAAS,gBAAiB,CAAA,MAAA,GAAS,IAAI,CAAA;AAE7C,QAAA,MAAM,IAAO,GAAA;AAAA,UACT,gBAAgB,MAAM,CAAA,CAAA,CAAA;AAAA,UACtB,MAAO,CAAA,YAAA,CAAa,IAAK,CAAA,KAAK,CAAC,CAAA;AAAA,UAC/B,CAAe,YAAA,EAAA,aAAA,CAAc,IAAK,CAAA,IAAI,CAAC,CAAA,IAAA;AAAA,SAC3C;AAEA,QAAA,MAAM,OAAU,GAAA,MAAA,CAAO,IAAK,CAAA,OAAO,EAAE,MAAS,GAAA,CAAA;AAC9C,QAAA,IAAI,OAAS,EAAA;AACT,UAAK,IAAA,CAAA,IAAA,CAAK,MAAO,CAAA,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAE/C,UAAM,MAAA,SAAA,GAAY,MAAO,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAI,SAAU,CAAC,OAAS,EAAA,OAAO,CAAG,EAAA;AACxE,YAAA,OAAO,CAAY,SAAA,EAAA,kBAAA,CAAmB,OAAO,CAAC,CAAM,GAAA,EAAA,uBAAA,CAAwB,OAAO,CAAC,CAAK,EAAA,EAAA,mBAAA,CAAoB,OAAS,EAAA,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,WACjI,CAAA;AAED,UAAA,IAAA,CAAK,KAAK,MAAO,CAAA,SAAA,CAAU,KAAK,KAAK,CAAA,EAAG,CAAC,CAAC,CAAA;AAE1C,UAAK,IAAA,CAAA,IAAA,CAAK,MAAO,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA;AAGzB,QAAK,IAAA,CAAA,IAAA,CAAK,OAAO,CAAiD,8CAAA,EAAA,IAAI,MAAM,OAAU,GAAA,MAAA,GAAS,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA;AAEvG,QAAA,MAAM,WAAc,GAAA,cAAA,CAAe,GAAI,CAAA,SAAU,GAAG,KAAO,EAAA;AACvD,UAAA,OAAO,CAAS,MAAA,EAAA,0BAAA,CAA2B,cAAe,CAAA,KAAK,CAAC,CAAC,CAAA,CAAA;AAAA,SACpE,CAAA;AAED,QAAK,IAAA,CAAA,IAAA,CAAK,OAAO,CAAY,SAAA,EAAA,WAAA,CAAY,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;AAExD,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAEb,QAAc,aAAA,CAAA,YAAY,EAAE,IAAK,CAAA;AAAA,UAC7B,IAAM,EAAA,MAAA;AAAA,UACN,IAAM,EAAA,OAAA;AAAA,UACN,UAAY,EAAA,cAAA;AAAA,UACZ,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAI;AAAA,SACvB,CAAA;AAAA;AACL;AACJ;AAEJ,EAAO,OAAA,aAAA;AACX;AAEA,SAAS,MAAA,CAAO,KAAe,EAAA,KAAA,GAAQ,CAAW,EAAA;AAC9C,EAAA,OAAO,MACF,KAAM,CAAA,IAAI,CACV,CAAA,GAAA,CAAI,SAAU,IAAM,EAAA;AACjB,IAAA,OAAO,GAAG,GAAK,CAAA,MAAA,CAAO,KAAK,CAAC,GAAG,IAAI,CAAA,CAAA;AAAA,GACtC,CACA,CAAA,IAAA,CAAK,IAAI,CAAA;AAClB;AAEO,SAAS,iBAAA,CAAkB,aAAqC,EAAA,SAAA,EAAmB,QAAwB,EAAA;AAC9G,EAAA,MAAM,SAAY,GAAA;AAAA,IACd,qBAAA;AAAA,IACA,CAAA,sEAAA,CAAA;AAAA,IACA,CAAA,kEAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,KAAA,MAAW,CAAC,YAAc,EAAA,SAAS,KAAK,MAAO,CAAA,OAAA,CAAQ,aAAa,CAAG,EAAA;AACnE,IAAU,SAAA,CAAA,IAAA,CAAK,CAAgB,aAAA,EAAA,YAAY,CAAI,EAAA,CAAA,CAAA;AAC/C,IAAA,SAAA,CAAU,IAAK,CAAA,SAAA,CAAU,GAAI,CAAA,CAAC,EAAO,KAAA,MAAA,CAAO,EAAG,CAAA,IAAI,CAAC,CAAA,CAAE,IAAK,CAAA,MAAM,CAAC,CAAA;AAClE,IAAA,SAAA,CAAU,KAAK,CAAG,CAAA,CAAA,CAAA;AAClB,IAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA;AAGrB,EAAGA,aAAA,CAAA,aAAA,CAAmBC,qBAAK,SAAW,EAAA,QAAQ,GAAG,SAAU,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACzE;AC1gDO,IAAe,cAAf,MAA+C;AAAA,EAClD,WAAA,CACa,SACA,IACX,EAAA;AAFW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA;AACV,EAEH,MAAM,UAAA,CAAW,QAA4B,EAAA,GAAA,EAAa,KAAuC,EAAA;AAC7F,IAAM,MAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MACzB,KAAA;AAAA,MACA,UAAUE,aAAS,CAAA,kBAAA;AAAA,MACnB,IAAA,EAAMC,cAAU,EAAA,CAAE,OAAQ;AAAA,KAC7B,CAAA;AAAA;AACL,EAEA,MAAM,WAAA,CAAY,QAA4B,EAAA,GAAA,EAAa,OAAyC,EAAA;AAChG,IAAO,OAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAAA,MAC1B,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,QAAA,EAAU,QAAQ,QAAY,IAAA,KAAA,CAAA;AAAA,MAC9B,MAAM,OAAQ,CAAA,IAAA;AAAA,MACd,QAAQ,OAAQ,CAAA;AAAA,KACnB,CAAA;AAAA;AACL,EAEA,MAAM,YAAY,QAA8C,EAAA;AAC5D,IAAM,MAAA,KAAA,GAAQ,MAAM,QAAA,CAAS,QAAS,EAAA;AACtC,IAAO,OAAA,KAAA,CAAM,MAAM,IAAS,KAAA,QAAA;AAAA;AAChC,EAEA,oBAAA,CAAqB,MAAY,IAA2C,EAAA;AACxE,IAAO,OAAA;AAAA,MACH,KAAA,EAAO,MAAO,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,MACxB,IAAI,IAAK,CAAA,OAAA;AAAA,MACT,MAAA,EAAQ,KAAK,MAAU,IAAA,IAAA;AAAA,MACvB,IAAA;AAAA,MACA,IAAM,EAAA,IAAA,CAAK,QAAa,KAAA,IAAA,GAAO,KAAK,IAAO,GAAA,KAAA,CAAA;AAAA,MAC3C,QAAA,EAAU,IAAK,CAAA,QAAA,IAAYD,aAAS,CAAA;AAAA,KACxC;AAAA;AACJ,EAEA,YAAA,CAAa,QAAyB,OAAoC,EAAA;AACtE,IAAA,MAAM,gBAAgB,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,KAAW,IAAY,CAAA;AAC7D,IAAO,OAAAC,cAAA,GACF,SAAU,CAAA,MAAA,EAAQ,EAAE,CACpB,CAAA,SAAA,CAAU,OAAW,IAAA,aAAA,EAAe,EAAE,CAAA;AAAA;AAEnD;AC1DA,SAAS,iBAAiB,KAAkE,EAAA;AACxF,EAAA,MAAM,GAAwC,GAAA;AAAA,IAC1C,eAAiB,EAAA,WAAA;AAAA,IACjB,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,GAAI,CAAA,eAAA,CAAgB,QAAS,CAAA,GAAG,CAAG,EAAA;AACnC,IAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAG7D,EAAO,OAAA,GAAA;AACX;AAEO,SAAS,uBAAA,CACZ,SACA,EAAA,QAAA,EACA,YACI,EAAA;AACJ,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;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EA0DZ,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,oCAAA,EA68CK,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,EAAAJ,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,6DAAA,EAoByC,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;AAAA;AAAA,QAAA,EA8CZ,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;AAAA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","file":"index.cjs","sourcesContent":["import { Address, Cell } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\nimport * as crc32 from 'crc-32'\n\n/**\n * Wraps a blueprint-like artifact in a `Cell`. The constrains on the input type are loosened\n * and only the `hex` property is made required.\n *\n * @param artifact Blueprint JSON artifact object\n * @returns {Cell}\n */\nexport const cellFromArtifact = ({ hex }: { hex: string; hash?: string; hashBase64?: string }): Cell =>\n Cell.fromHex(hex)\n\n// ------------- Testing utils for Lz Ton Packet encoding/decoding -----------\n\nexport function getOpcodeCRC(input: string): bigint {\n return BigInt(crc32.str(input) >>> 0) // Ensure the result is unsigned and convert to bigint\n}\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\nexport function bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const addressToBigInt = (address: Address): bigint => {\n return BigInt('0x' + address.hash.toString('hex'))\n}\n\n/**\n * Convert a value to a 32 byte buffer, if the value is a string, it can only be a hex string\n * @param value\n * @param maxIntermediateBufferSize\n */\nexport function to32ByteBuffer(value: bigint | number | string | Uint8Array, maxIntermediateBufferSize = 66): Buffer {\n if (typeof value === 'string') {\n if (!isValidHex(value)) {\n throw new Error('only hex string is supported')\n }\n let hex = trim0x(value)\n if (hex.length % 2 !== 0) {\n hex = '0' + hex\n }\n value = toBigIntBE(Buffer.from(hex, 'hex'))\n }\n if (value instanceof Uint8Array) {\n value = toBigIntBE(Buffer.from(value))\n }\n const bf = toBufferBE(BigInt(value), maxIntermediateBufferSize)\n // trim from the left, keep the right 32 bytes\n return bf.subarray(-32)\n}\n\nfunction trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\nfunction isValidHex(str: string): boolean {\n const hexRegex = /^(0x)?[0-9A-Fa-f]+$/\n return hexRegex.test(str)\n}\n\nexport function findDeepestCell(cell: Cell): { subTreeCells: number } {\n // Get all references from the current cell\n const refs = Array.from({ length: cell.refs.length }, (_, i) => cell.refs.at(i))\n\n // Base case: if no references, return current cell with depth 0\n if (refs.length === 0) {\n return { subTreeCells: 1 }\n }\n\n let size = 0\n\n // Check all references\n for (const ref of refs) {\n if (!ref) continue\n\n size += findDeepestCell(ref).subTreeCells\n }\n\n return { subTreeCells: size }\n}\n","import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { getOpcodeCRC } from './utils'\n\nexport interface ConstructorArgs {\n [key: string]: string\n}\n\n// requirements:\n// 1. each attribute can have only one dependency (one constructor call)\n// 2. The name of the inputArg which is a class should be the same as the class name\nexport interface Attribute {\n name: string\n type: string\n value: string\n}\n\nexport type ConstructorCallGenerator = (args: ConstructorArgs, _: unknown) => string\n\nexport interface FieldMap {\n [key: number]: string\n}\nexport interface InverseFieldMap {\n [key: string]: number\n}\n\nexport interface TonObject {\n constructorName: string\n constructorInputArgs: ConstructorArgs\n // the order of these attributes need to be preserved\n attributes: Attribute[]\n // the inside ::NAME of the object\n tonName: string\n // infer the implicit map of orders of the objects at declaration and the fields\n fieldMap: FieldMap\n inverseFieldMap: InverseFieldMap\n // You need to have generated everything to be able to resolve the dependencies to generate the codes.\n constructorCode?: string\n constructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for types\n tsTypeName?: string\n tsTypeCode?: string\n // stuff for deconstructor\n deconstructorName?: string\n deconstructorCode?: string\n deconstructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for deconstructing md's\n is_md?: boolean\n}\n\n// maps the name of the ton object to the object\nexport interface TonObjectsDict {\n [name: string]: TonObject\n}\n\nexport interface TonViewFunction {\n name: string\n args: { [key: string]: string }\n returnType: string[]\n code: string\n}\n\n// maps the name of the contract to a list of view functions\nexport interface TonViewFunctionsDict {\n [name: string]: TonViewFunction[]\n}\n\nconst file_signature_header = `////// Generated by sdk/sdk-generator.ts`\nconst ERRORCODE_MASK = 0x7ffn\n\nfunction tonTypeToTStype(tonType: string): string {\n switch (tonType) {\n case 'int':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n case 'address':\n return 'bigint'\n\n case 'cell':\n case 'cellRef':\n 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 console.log(`Parsing ${name}...`)\n\n const tonNameRegex = /const int\\s+(?:md::)?[\\w:]+::NAME = \"(.*?)\"u;/\n const tonNameMatch = strInput.match(tonNameRegex)\n const tonName = tonNameMatch ? tonNameMatch[1] : name\n\n const attributes = parseDeclareLines(body, fieldMap)\n results[name] = {\n constructorInputArgs: args,\n attributes,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n\n return results\n}\n\nexport function saveBaseEventHandler(\n directory: string,\n opcodesImportPath = '../constants',\n allTypesImportPath = './allTypes',\n tonObjectUnwrapperImportPath = './TonObjectUnwrapper',\n tonContractWrapperImportPath = './TonContractWrapper'\n): void {\n const allTypes = ['ExtendedContract', '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'\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 TonObjectUnwrapper.getTypeOf(wrapper, this._event.body)\n const tsCasterName = 'get' + nameMap[this.bodyName] + 'ToTS'\n\n const method = TonObjectUnwrapper[tsCasterName as keyof typeof TonObjectUnwrapper]\n if (typeof method === 'function') {\n this.body = await method(wrapper, this._event.body)\n } else {\n console.log('Method' + tsCasterName + 'does not exist.')\n }\n\n this.initialStorage = this._event.initialStorage\n this.initialized = true\n return this.initialized\n }\n}\n\nexport class 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 saveClasslibWrapper(directory: string, baseWrapper?: string): void {\n if (baseWrapper === undefined) {\n baseWrapper = `import { BaseWrapper, SendRequestOptions } from '@layerzerolabs/ton-sdk-tools'`\n }\n const savedCode = `${file_signature_header}\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n contractAddress,\n beginCell,\n} from '@ton/core'\n\n${baseWrapper}\n\nexport type GetIntFnNames =\n | 'cl::get<uint8>'\n | 'cl::get<uint16>'\n | 'cl::get<uint32>'\n | 'cl::get<uint64>'\n | 'cl::get<uint256>'\n | 'cl::get<coins>'\n | 'cl::get<bool>'\n | 'cl::get<address>'\n\nexport class 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(\n provider: ContractProvider,\n via: Sender,\n opts: SendRequestOptions,\n ): 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 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`\n\n fs.writeFileSync(path.join(directory, 'ClasslibWrapper.ts'), savedCode)\n}\n\nexport function saveTonContractWrapper(\n tonObjects: TonObjectsDict,\n directory: string,\n classlibWrapperImportPath = './ClasslibWrapper'\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 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 ${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): 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}'\n\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n\nexport class LzDict {\n _cell: Cell\n\n constructor(data: Cell) {\n this._cell = data\n }\n\n static empty(): LzDict {\n return new LzDict(beginCell().endCell())\n }\n\n async getCell(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<Cell> {\n return wrapper.getDictCellItem(this._cell, key)\n }\n\n async getBigInt(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n return wrapper.getDictUint256Item(this._cell, key)\n }\n\n async set(key: bigint, value: Cell, wrapper: ExtendedContract<TonContractWrapper>): Promise<void> {\n this._cell = await wrapper.getSetDictItem(this._cell, key, value)\n }\n\n asCell(): Cell {\n return this._cell\n }\n}\n\nexport 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): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\n 'ExtendedContract',\n 'LzDict',\n 'Md',\n 'nameMap',\n ].sort()\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Cell, Transaction, TransactionComputeVm, TransactionDescriptionGeneric, beginCell } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\nimport { flattenTransaction } from '@ton/test-utils'\n\nimport { getLzDict,\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from '${allTypesImportPath}'\nimport { TonContractWrapper } from '${tonContractWrapperImportPath}'\n\nexport class TonObjectUnwrapper {\n static async getTypeOf(provider: ExtendedContract<TonContractWrapper>, obj_cell: Cell): Promise<string> {\n const ret = await provider.getViewFunction('cl::typeof', [{ type: 'cell', cell: obj_cell }])\n return TonContractWrapper.bigintToAsciiString(ret.readBigNumber())\n }\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 { ExtendedContract, TonContractWrapper } from '../wrappers'`,\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 SendMode,\n Sender,\n SenderArguments,\n beginCell,\n} from '@ton/core'\n\nexport interface SendRequestOptions {\n value: number | bigint | string\n bounce?: boolean\n sendMode?: SendMode\n queryId?: number | bigint\n withInit?: boolean\n}\n\nexport abstract class BaseWrapper implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint | string): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n async sendRequest(provider: ContractProvider, via: Sender, request: SenderArguments): Promise<void> {\n return provider.internal(via, {\n value: request.value,\n sendMode: request.sendMode ?? undefined,\n body: request.body,\n bounce: request.bounce,\n })\n }\n\n async getDeployed(provider: ContractProvider): Promise<boolean> {\n const state = await provider.getState()\n return state.state.type !== 'uninit'\n }\n\n buildSenderArguments(body: Cell, opts: SendRequestOptions): SenderArguments {\n return {\n value: BigInt(opts.value),\n to: this.address,\n bounce: opts.bounce ?? true,\n body,\n init: opts.withInit === true ? this.init : undefined,\n sendMode: opts.sendMode ?? SendMode.PAY_GAS_SEPARATELY,\n } satisfies SenderArguments\n }\n\n beginMessage(opcode: number | bigint, queryId?: number | bigint): Builder {\n const randomQueryId = Math.floor(Math.random() * 100000000000)\n return beginCell()\n .storeUint(opcode, 32)\n .storeUint(queryId ?? randomQueryId, 64)\n }\n}\n","import fs from 'fs'\nimport path from 'path'\n\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} from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n ExtendedContract,\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n deconstructorMap,\n keyMap,\n} from '${options.relativeSrcPath}'\n\nconst RECURSIVE_DECODE = false\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 SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n recursiveDecode?: boolean\n}\n\nexport interface SendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<TonContractWrapper | JettonMinter>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n recursiveDecode?: boolean\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 openAndDeployAllStorages(\n blockchain: Blockchain,\n multiSigOwner1: SandboxContract<TreasuryContract>\n): Promise<SandboxContract<TonContractWrapper>> {\n // ===================================open allStorages=====================================\n\n const allStorages = blockchain.openContract(\n TonContractWrapper.create(cellFromArtifact(AllStoragesArtifact), beginCell().endCell())\n )\n\n // ===================================deploy allStorages=====================================\n\n await sendInternalMessageAndExpect({\n value: protocolSetupGas['AllStorages.INITIALIZE'],\n sender: multiSigOwner1.getSender(),\n contract: allStorages,\n expectedTransactions: [\n {\n from: multiSigOwner1.address,\n to: allStorages.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 return allStorages\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n recursiveDecode = RECURSIVE_DECODE,\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)\n .storeRef(targetContract.init.data)\n .endCell()\n\n rawMessageCell = rawMessageBuilder\n .storeUint(7, 108)\n .storeRef(targetContractStateInit)\n .storeRef(messageBody)\n .endCell()\n } else {\n rawMessageCell = rawMessageBuilder.storeUint(1, 107).storeRef(messageBody).endCell()\n }\n\n const orderMsg: TransferRequest = {\n type: 'transfer',\n sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE,\n message: rawMessageCell,\n }\n\n // one of the signers proposes deploying the controller\n let internalMsgResults = await multiSigContract.sendNewOrder(signers[0].getSender(), [orderMsg], curTime() + 100)\n\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: orderAddress,\n deploy: true,\n success: true,\n })\n\n // that makes sure that the target contract is a sandbox<TonContractWrapper>\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract) {\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).toHaveTransaction({\n from: orderAddress,\n to: multiSigContract.address,\n op: MultiSigOpCodes.multisig.execute,\n success: true,\n })\n\n // the multisig should deliver the message to the target contract\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n if (recursiveDecode && 'getCurrentStorageCell' in targetContract) {\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 = RECURSIVE_DECODE,\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) {\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 expect(actualTransactions).toHaveTransaction(tx)\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 TonObjectUnwrapper.getTypeOf(contract, 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 TonObjectUnwrapper.getTypeOf(contract, 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 } from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n OAppFixture,\n OAppFlowGas,\n addMsgLibToController,\n emptyObject,\n protocolSetupGas,\n sendInternalMessageAndExpect,\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 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 { Profile, addressToBigInt, cellFromArtifact } 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 sendInternalMessageAndExpect,\n sendMessageViaMultisigAndExpect,\n serializeAddressList,\n setDefaultEndpointConfig,\n wireChannels,\n} from './auto-utils-common'\nimport {\n ExtendedContract,\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): Promise<void> {\n requireDefined(sendDvnFixtures)\n requireDefined(receiveDvnFixtures)\n const msglib = uln.get(dstEid)\n requireDefined(msglib)\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(DvnFeelibArtifact),\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 - 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\nconst decimalCount = 9\nconst decimal = pow10(decimalCount)\nconst defaultPath = 'gasInfo'\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface Profile {\n profileGas: boolean\n fileName: string\n filePath?: string\n}\n\nfunction createDirectoryIfNotExist(directoryPath: string): void {\n if (!fs.existsSync(directoryPath)) {\n fs.mkdirSync(directoryPath, { recursive: true })\n }\n}\n\nfunction sortAndSave(filePath: string, gasInfo: GasInfo): void {\n const entries = Object.entries(gasInfo)\n const sortedEntries = entries.sort(([, valueA], [, valueB]) => parseFloat(valueA) - parseFloat(valueB))\n const jsonData = JSON.stringify(Object.fromEntries(sortedEntries), null, 2)\n fs.writeFileSync(filePath, `${jsonData}\\n`, 'utf8')\n}\n\nfunction readOrCreateJsonFile(filePath: string): GasInfo {\n if (fs.existsSync(filePath)) {\n const fileContent: string = fs.readFileSync(filePath, 'utf8')\n return JSON.parse(fileContent) as GasInfo\n } else {\n return {}\n }\n}\n\nfunction pow10(n: number): bigint {\n let v = 1n\n for (let i = 0; i < n; i++) {\n v *= 10n\n }\n return v\n}\n\nexport function formatCoinsPure(value: bigint, precision = 6): string {\n let whole = value / decimal\n\n let frac = value % decimal\n const precisionDecimal = pow10(decimalCount - precision)\n if (frac % precisionDecimal > 0n) {\n // round up\n frac += precisionDecimal\n if (frac >= decimal) {\n frac -= decimal\n whole += 1n\n }\n }\n frac /= precisionDecimal\n\n return `${whole.toString()}${frac !== 0n ? '.' + frac.toString().padStart(precision, '0').replace(/0+$/, '') : ''}`\n}\n\nfunction formatCoins(value: bigint | undefined, precision = 6): string {\n if (value === undefined) return 'N/A'\n\n return formatCoinsPure(value, precision)\n}\n/**\n * Prints transaction fees.\n * Example output:\n * ```\n * ┌─────────┬───────────────────┬──────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────┬────────────────┬──────────┬────────────┐\n * │ (index) │ address │ op │ valueIn │ valueOut │ totalFees │ inForwardFee │ outForwardFee │ outActions │ computeFee │ exitCode │ actionCode │\n * ├─────────┼───────────────────┼──────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────┼────────────────┼──────────┼────────────┤\n * │ 0 │ 'lzDeployer' │ 'N/A' │ 'N/A' │ '1 TON' │ '0.002118 TON' │ 'N/A' │ '0.000818 TON' │ 1 │ '0.000775 TON' │ 0 │ 0 │\n * │ 1 │ 'counter' │ '0x14da9f4f' │ '1 TON' │ '0.994674 TON' │ '0.004814 TON' │ '0.000546 TON' │ '0.00077 TON' │ 1 │ '0.004558 TON' │ 0 │ 0 │\n * │ 2 │ 'endpointChannel' │ '0x24f8afd1' │ '0.994674 TON' │ '0.988235 TON' │ '0.005944 TON' │ '0.000513 TON' │ '0.000744 TON' │ 1 │ '0.005696 TON' │ 0 │ 0 │\n * │ 3 │ 'payload' │ '0x1b8fba43' │ '0.988235 TON' │ '0.983208 TON' │ '0.004437 TON' │ '0.000496 TON' │ '0.000885 TON' │ 1 │ '0.004142 TON' │ 0 │ 0 │\n * │ 4 │ 'counter' │ '0x507674bc' │ '0.983208 TON' │ '1.023606 TON' │ '0.00899 TON' │ '0.00059 TON' │ '0.000919 TON' │ 2 │ '0.008684 TON' │ 0 │ 0 │\n * │ 5 │ 'payload' │ '0x648a33b0' │ '0.049522 TON' │ '1.021254 TON' │ '0.002702 TON' │ '0.00032 TON' │ '0.00044 TON' │ 1 │ '0.002556 TON' │ 0 │ 0 │\n * │ 6 │ 'lzDeployer' │ 'no body' │ '0.974085 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * │ 7 │ 'lzDeployer' │ 'no body' │ '1.021254 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * └─────────┴───────────────────┴──────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────┴────────────────┴──────────┴────────────┘\n * ```\n */\n\nexport function printTransactionTrace(\n transactions: Transaction[],\n opcodeInfo: { [p: string]: string },\n callerStack?: string,\n profile?: Profile\n): void {\n const { stack } = new Error()\n callerStack ??= stack\n console.info(callerStack?.split('\\n')[2].trim())\n let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n if (profile?.profileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile.fileName}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n console.table(\n transactions\n .map((tx) => {\n if (tx.description.type !== 'generic') return undefined\n\n const body = tx.inMessage?.info.type === 'internal' ? tx.inMessage.body.beginParse() : undefined\n const op = body === undefined ? 0n : body.remainingBits >= 32 ? body.preloadUint(32) : 0n\n\n const totalFees = formatCoins(tx.totalFees.coins)\n\n const computeFees = formatCoins(\n tx.description.computePhase.type === 'vm' ? tx.description.computePhase.gasFees : undefined\n )\n\n const totalFwdFees = formatCoins(tx.description.actionPhase?.totalFwdFees ?? undefined)\n\n const valueIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.value.coins : undefined\n )\n\n const valueOut = formatCoins(\n tx.outMessages\n .values()\n .reduce(\n (total, message) =>\n total + (message.info.type === 'internal' ? message.info.value.coins : 0n),\n 0n\n )\n )\n\n const forwardIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.forwardFee : undefined\n )\n\n // remove 11 bits from front of tx.address\n const addressString =\n tx.address.toString(16).length != 64 ? 'UNKNOWN' : Address.parseRaw('1:' + tx.address.toString(16))\n const opString = op.toString() in opcodeInfo ? opcodeInfo[op.toString()] : op.toString()\n cumulativeFees += tx.totalFees.coins + (tx.description.actionPhase?.totalFwdFees ?? 0n)\n\n if (profile?.profileGas) gasInfo[opString] = formatCoins(cumulativeFees)\n\n return {\n address: addressString,\n op: opString,\n // valueIn,\n // valueOut,\n totalFees: totalFees,\n inForwardFee: forwardIn,\n outForwardFee: totalFwdFees,\n // outActions: tx.description.actionPhase?.totalActions ?? 'N/A',\n computeFee: computeFees,\n // exitCode: tx.description.computePhase.type === 'vm' ? tx.description.computePhase.exitCode : 'N/A',\n // actionCode: tx.description.actionPhase?.resultCode ?? 'N/A',\n cumulativeFee: formatCoins(cumulativeFees),\n }\n })\n .filter((v) => v !== undefined)\n )\n if (profile?.profileGas) sortAndSave(filePath, gasInfo)\n}\n"]}