diff --git a/Cargo.lock b/Cargo.lock
index defccd6e057..3d30241d98d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4074,6 +4074,15 @@ dependencies = [
"parity-scale-codec",
]
+[[package]]
+name = "demo-reply-callback"
+version = "0.1.0"
+dependencies = [
+ "gear-wasm-builder",
+ "gear-workspace-hack",
+ "gstd",
+]
+
[[package]]
name = "demo-reservation-manager"
version = "0.1.0"
@@ -5450,6 +5459,7 @@ dependencies = [
"demo-mul-by-const",
"demo-piggy-bank",
"demo-ping",
+ "demo-reply-callback",
"demo-value-sender-ethexe",
"derive_more 2.1.1",
"ethexe-blob-loader",
diff --git a/Cargo.toml b/Cargo.toml
index adfd3f7228f..773d98fc053 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -503,6 +503,7 @@ demo-proxy = { path = "examples/proxy", default-features = false }
demo-proxy-relay = { path = "examples/proxy-relay" }
demo-proxy-reservation-with-gas = { path = "examples/proxy-reservation-with-gas" }
demo-read-big-state = { path = "examples/read-big-state", default-features = false }
+demo-reply-callback = { path = "examples/reply-callback" }
demo-reservation-manager = { path = "examples/reservation-manager" }
demo-reserve-gas = { path = "examples/reserve-gas", default-features = false }
demo-rwlock = { path = "examples/rwlock" }
diff --git a/Makefile b/Makefile
index aebdb8c2b41..65b90daef86 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@ ethexe-contracts-pre-commit:
@ echo " > Copying ERC1967Proxy artifact" && cp ./ethexe/contracts/out/ERC1967Proxy.sol/ERC1967Proxy.json ./ethexe/ethereum/abi
@ echo " > Copying WrappedVara artifact" && cp ./ethexe/contracts/out/WrappedVara.sol/WrappedVara.json ./ethexe/ethereum/abi
@ echo " > Copying BatchMulticall" && cp ./ethexe/contracts/out/BatchMulticall.sol/BatchMulticall.json ./ethexe/ethereum/abi
+ @ echo " > Copying DemoCaller" && cp ./ethexe/contracts/out/DemoCaller.sol/DemoCaller.json ./ethexe/ethereum/abi
# Common section
.PHONY: show
diff --git a/ethexe/contracts/test/DemoCaller.sol b/ethexe/contracts/test/DemoCaller.sol
new file mode 100644
index 00000000000..b3bb9a01431
--- /dev/null
+++ b/ethexe/contracts/test/DemoCaller.sol
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.33;
+
+import {IMirror} from "src/IMirror.sol";
+import {IDemoCallbacks} from "test/IDemoCallbacks.sol";
+
+contract DemoCaller is IDemoCallbacks {
+ IMirror public immutable VARA_ETH_PROGRAM;
+
+ bool public replyOnMethodNameCalled;
+ bool public onErrorReplyCalled;
+
+ event MethodNameReplied(bytes32 messageId);
+
+ event ErrorReplied(bytes32 messageId, bytes payload, bytes4 replyCode);
+
+ error UnauthorizedCaller();
+
+ constructor(IMirror _varaEthProgram) {
+ VARA_ETH_PROGRAM = _varaEthProgram;
+ }
+
+ modifier onlyVaraEthProgram() {
+ _onlyVaraEthProgram();
+ _;
+ }
+
+ function _onlyVaraEthProgram() internal view {
+ if (msg.sender != address(VARA_ETH_PROGRAM)) {
+ revert UnauthorizedCaller();
+ }
+ }
+
+ function methodName(bool isPanic) external returns (bytes32) {
+ return VARA_ETH_PROGRAM.sendMessage(abi.encodePacked(isPanic), true);
+ }
+
+ /// forge-lint: disable-next-line(mixed-case-function)
+ function replyOn_methodName(bytes32 messageId) external onlyVaraEthProgram {
+ replyOnMethodNameCalled = true;
+
+ emit MethodNameReplied(messageId);
+ }
+
+ function onErrorReply(bytes32 messageId, bytes calldata payload, bytes4 replyCode)
+ external
+ payable
+ onlyVaraEthProgram
+ {
+ onErrorReplyCalled = true;
+
+ emit ErrorReplied(messageId, payload, replyCode);
+ }
+}
diff --git a/ethexe/contracts/test/IDemoCallbacks.sol b/ethexe/contracts/test/IDemoCallbacks.sol
new file mode 100644
index 00000000000..ff696b12c0c
--- /dev/null
+++ b/ethexe/contracts/test/IDemoCallbacks.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.33;
+
+import {ICallbacks} from "src/ICallbacks.sol";
+
+interface IDemoCallbacks is ICallbacks {
+ /// forge-lint: disable-next-line(mixed-case-function)
+ function replyOn_methodName(bytes32 messageId) external;
+}
diff --git a/ethexe/ethereum/abi/DemoCaller.json b/ethexe/ethereum/abi/DemoCaller.json
new file mode 100644
index 00000000000..254dbb5f24f
--- /dev/null
+++ b/ethexe/ethereum/abi/DemoCaller.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_varaEthProgram","type":"address","internalType":"contract IMirror"}],"stateMutability":"nonpayable"},{"type":"function","name":"VARA_ETH_PROGRAM","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IMirror"}],"stateMutability":"view"},{"type":"function","name":"methodName","inputs":[{"name":"isPanic","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"function","name":"onErrorReply","inputs":[{"name":"messageId","type":"bytes32","internalType":"bytes32"},{"name":"payload","type":"bytes","internalType":"bytes"},{"name":"replyCode","type":"bytes4","internalType":"bytes4"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"onErrorReplyCalled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"replyOnMethodNameCalled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"replyOn_methodName","inputs":[{"name":"messageId","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ErrorReplied","inputs":[{"name":"messageId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"payload","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"replyCode","type":"bytes4","indexed":false,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"MethodNameReplied","inputs":[{"name":"messageId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"error","name":"UnauthorizedCaller","inputs":[]}],"bytecode":{"object":"0x60a034607357601f61040d38819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b0381168103607357608052604051610381908161008c823960805181818160700152818161019b01526103420152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80634a646c7f146102375780638ed2570c1461021357806396b3d5a914610116578063b52ab555146100c4578063d24012f8146100a35763dab506b21461005b575f80fd5b3461009f575f36600319011261009f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461009f575f36600319011261009f57602060ff5f54166040519015158152f35b3461009f57602036600319011261009f576100dd610340565b600160ff195f5416175f557fe84f069632bb62380c2db01d855c4a504e087d71add44c3639386496f56fcfd260206040516004358152a1005b3461009f57602036600319011261009f5760043580151580910361009f5760206040518181019260f81b83526001815261015160218261030a565b6064604051809481936242129d60e81b8352604060048401525180918160448501528484015e5f83828401015260016024830152601f801991011681010301815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610208575f906101d5575b602090604051908152f35b506020813d602011610200575b816101ef6020938361030a565b8101031261009f57602090516101ca565b3d91506101e2565b6040513d5f823e3d90fd5b3461009f575f36600319011261009f57602060ff5f5460081c166040519015158152f35b606036600319011261009f5760243567ffffffffffffffff811161009f573660238201121561009f57806004013567ffffffffffffffff811161009f57366024828401011161009f5760443563ffffffff60e01b811680910361009f577f71e1710f6581d7e128cb38d25b5ea07b760f138a9073096c50be9c23d0f2b45e926024926080926102c4610340565b61010061ff00195f5416175f558160405195869460043586526060602087015282606087015201858501375f8383018501526040830152601f01601f19168101030190a1005b90601f8019910116810190811067ffffffffffffffff82111761032c57604052565b634e487b7160e01b5f52604160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361037257565b635c427cd960e01b5f5260045ffd","sourceMap":"163:1305:173:-:0;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;-1:-1:-1;;;;;163:1305:173;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;163:1305:173;;;;;;539:34;;163:1305;;;;;;;;539:34;163:1305;;;;;;;;;;;;;;;;;-1:-1:-1;163:1305:173;;;;;;-1:-1:-1;163:1305:173;;;;;-1:-1:-1;163:1305:173","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c80634a646c7f146102375780638ed2570c1461021357806396b3d5a914610116578063b52ab555146100c4578063d24012f8146100a35763dab506b21461005b575f80fd5b3461009f575f36600319011261009f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461009f575f36600319011261009f57602060ff5f54166040519015158152f35b3461009f57602036600319011261009f576100dd610340565b600160ff195f5416175f557fe84f069632bb62380c2db01d855c4a504e087d71add44c3639386496f56fcfd260206040516004358152a1005b3461009f57602036600319011261009f5760043580151580910361009f5760206040518181019260f81b83526001815261015160218261030a565b6064604051809481936242129d60e81b8352604060048401525180918160448501528484015e5f83828401015260016024830152601f801991011681010301815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610208575f906101d5575b602090604051908152f35b506020813d602011610200575b816101ef6020938361030a565b8101031261009f57602090516101ca565b3d91506101e2565b6040513d5f823e3d90fd5b3461009f575f36600319011261009f57602060ff5f5460081c166040519015158152f35b606036600319011261009f5760243567ffffffffffffffff811161009f573660238201121561009f57806004013567ffffffffffffffff811161009f57366024828401011161009f5760443563ffffffff60e01b811680910361009f577f71e1710f6581d7e128cb38d25b5ea07b760f138a9073096c50be9c23d0f2b45e926024926080926102c4610340565b61010061ff00195f5416175f558160405195869460043586526060602087015282606087015201858501375f8383018501526040830152601f01601f19168101030190a1005b90601f8019910116810190811067ffffffffffffffff82111761032c57604052565b634e487b7160e01b5f52604160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361037257565b635c427cd960e01b5f5260045ffd","sourceMap":"163:1305:173:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;;;207:41;-1:-1:-1;;;;;163:1305:173;;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;586:79;;:::i;:::-;163:1305;;;;;;;;;1177:28;163:1305;;;;;;;1177:28;163:1305;;;;;;;-1:-1:-1;;163:1305:173;;;;;;;;;;;;;;;;;942:25;;;163:1305;;;;;;942:25;;;;;;:::i;:::-;163:1305;;;;;;;;;;913:61;;163:1305;;913:61;;163:1305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;913:61;;163:1305;;;;;;;913:16;163:1305;913:61;;;;;;163:1305;913:61;;;163:1305;;;;;;;;;913:61;;163:1305;913:61;;163:1305;913:61;;;;;;163:1305;913:61;;;:::i;:::-;;;163:1305;;;;;;;913:61;;;;;-1:-1:-1;913:61:173;;;163:1305;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:43;586:79;163:1305;586:79;163:1305;586:79;;;:::i;:::-;163:1305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;163:1305:173;;;1416:43;;;;163:1305;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;163:1305:173;;;;;-1:-1:-1;163:1305:173;671:158;752:16;-1:-1:-1;;;;;163:1305:173;730:10;:39;726:97;;671:158::o;726:97::-;792:20;;;;;;;","linkReferences":{},"immutableReferences":{"84438":[{"start":112,"length":32},{"start":411,"length":32},{"start":834,"length":32}]}},"methodIdentifiers":{"VARA_ETH_PROGRAM()":"dab506b2","methodName(bool)":"96b3d5a9","onErrorReply(bytes32,bytes,bytes4)":"4a646c7f","onErrorReplyCalled()":"8ed2570c","replyOnMethodNameCalled()":"d24012f8","replyOn_methodName(bytes32)":"b52ab555"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.33+commit.64118f21\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IMirror\",\"name\":\"_varaEthProgram\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"replyCode\",\"type\":\"bytes4\"}],\"name\":\"ErrorReplied\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MethodNameReplied\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VARA_ETH_PROGRAM\",\"outputs\":[{\"internalType\":\"contract IMirror\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPanic\",\"type\":\"bool\"}],\"name\":\"methodName\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"replyCode\",\"type\":\"bytes4\"}],\"name\":\"onErrorReply\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onErrorReplyCalled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"replyOnMethodNameCalled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"replyOn_methodName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"replyOn_methodName(bytes32)\":{\"notice\":\"forge-lint: disable-next-line(mixed-case-function)\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"test/DemoCaller.sol\":\"DemoCaller\"},\"evmVersion\":\"osaka\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@symbioticfi/core/=lib/symbiotic-rewards/lib/core/\",\":core/=lib/symbiotic-rewards/lib/core/\",\":ds-test/=lib/symbiotic-core/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":frost-secp256k1-evm/=lib/frost-secp256k1-evm/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/\",\":script/=script/\",\":src/=src/\",\":symbiotic-core/=lib/symbiotic-core/\",\":symbiotic-rewards/=lib/symbiotic-rewards/\",\":test/=test/\"],\"viaIR\":true},\"sources\":{\"lib/frost-secp256k1-evm/src/FROST.sol\":{\"keccak256\":\"0x8c8ba97570ce652b50ef98f2625844d38f74313a804afbb494d594249957982b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4f1ec027e9311ec16af843df5f79fe48be99b877db752e09910806023948faec\",\"dweb:/ipfs/QmU9Yg7fqxPfrDXjY3fUKhtBz3i8GgesuvXYhxiBMWygHB\"]},\"lib/frost-secp256k1-evm/src/utils/Memory.sol\":{\"keccak256\":\"0xe1d67c09eb54744acd7e397129c453860e11b6af20404614955a112f528e5e61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e2a71aec4d0d99240d30badcc80fd732e3bc30bc58c0ba289378e9277bacff57\",\"dweb:/ipfs/QmPSwCbje4kpysdmPKpeSnf6ZtcFFyGsjmgum3Chdi2VjA\"]},\"lib/frost-secp256k1-evm/src/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x53d96c7dd11a8e41a71c3a8e9f25c05755e0d7baeef735ab91f513f3b4d246d8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e04c980daeff86fed4415ff707d135b5449e71f075e6243963aed523218ef695\",\"dweb:/ipfs/QmQ6bvEpYX6z8yZieKqHY1T4e8DTRtFqfCfwHXfhrnmJ1c\"]},\"lib/frost-secp256k1-evm/src/utils/cryptography/Hashes.sol\":{\"keccak256\":\"0x309133627aa479b060dc680342c5160b83b3dc06242919cf04fbab6bd31a68b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ddafbe0ba7f6f70a9c4a2e231eb427744296fbe46f8d9e43dedda87c6171e5ff\",\"dweb:/ipfs/QmV1NReDo2Qak6W2sZZNAEV1XoLFUrWTJ9UduYka6acMBi\"]},\"lib/frost-secp256k1-evm/src/utils/cryptography/Schnorr.sol\":{\"keccak256\":\"0x5689c57b3d75a97638603fa7fddd2774771ba50541c7dbe32874243a36740489\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e5c45325f61c730e17cfaa86558136ba2f3c530022ceafda48eb5593d4378\",\"dweb:/ipfs/QmTUPujhSjJRhFDFJY5m2VQa5AYKgW5bUkHXJHWhBkDvzB\"]},\"lib/frost-secp256k1-evm/src/utils/cryptography/Secp256k1.sol\":{\"keccak256\":\"0x67e528aa32adcca7fafe401102c34b7dd1b259a74badbfa877dc4f6ab143cd1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://978921f8d1f89d4f2ae902274b65055ba2ed4c085e0ec765dbf3bba9121e6bda\",\"dweb:/ipfs/QmUxaMYVi256FjHhAZzQoGS3akM2xpaq2zwMcUbp9Zmrpp\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol\":{\"keccak256\":\"0x67672e4ca1dafdcc661d4eba8475cfac631fa0933309258e3af7644b92e1fb26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://30192451f05ea5ddb0c18bd0f9003f098505836ba19c08a9c365adf829454da2\",\"dweb:/ipfs/QmfCuZSCTyCdFoSKn7MSaN6hZksnQn9ZhrZDAdRTCbwGu2\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://15e3599867c2182f5831e9268b274b2ef2047825837df6b4d81c9e89254b093e\",\"dweb:/ipfs/QmZbL7XAYr5RmaNaooPgZRmcDXaudfsYQfYD9y5iAECvpS\"]},\"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/ICallbacks.sol\":{\"keccak256\":\"0x59b2c459562d95a574b7d578ae7780798034c66d6c8504dcc9d04ad68da2b25a\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://314f3f21da1fb9b985d282d07816b37f03706a12e0cc74f461fffd3ddd3a0e35\",\"dweb:/ipfs/QmXjkU3LXfPzQY7fyyqytxrAjosWBZsMmRvvc62noRAqjp\"]},\"src/IMirror.sol\":{\"keccak256\":\"0xb69ad2881333c466b4c115dce8795ed1f21b52b00fbc929b5d0c76ee336f253b\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://25f1d70354c1b804b0de6c779690401a9043037e26ee8bf0d55bc1bdd0c1a876\",\"dweb:/ipfs/QmS9DmLZHTSovhwyHykzCQf73yie2NBFN5qTEDdBiuAGpg\"]},\"src/IRouter.sol\":{\"keccak256\":\"0xc933ed91b4e3da6b0880841f2423a1e71a9bc49aca6f33aebf6c902a60c146aa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://c8229438d62a62be114727c59bd0ab8c2e77cfcae6c14ac885c3902661f8c04a\",\"dweb:/ipfs/QmeGw253fSke8BT3c6pvcxke3BYhr7DZCDA8Rd8Fy3QWJF\"]},\"src/libraries/Gear.sol\":{\"keccak256\":\"0xd7c2749012a8bbfcc72b809d7b71fa2fd7fd6a9b3a51b4aaf1f1b8ead14da41c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://855047154ced953570d98c87823e89b97683f17bcd5b855603a4a022eb63c645\",\"dweb:/ipfs/QmaYJn6peukkWaWQo59qUmSQggyofJYEPChBpZRqXtRakA\"]},\"test/DemoCaller.sol\":{\"keccak256\":\"0xadd6146eed29ba5150cad0f87c9e2cc5c6a9df98b8e30f6250bc9bb55296cef4\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://9ef6db13d6b15d0568f8a8cad1520debbba95bd93e6f4daa3d3d74002e5c7a96\",\"dweb:/ipfs/QmQFRcNbP4BhkMNRQfGWZp7QzMJJRMD4w9QZ2FvDCNp4GP\"]},\"test/IDemoCallbacks.sol\":{\"keccak256\":\"0xdd14693a8a8be3fa24b0bff3c28c685c2ed4c67785474667efab10f92720e00d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://dcda3e90af031a92e2aca4d1b34444eebf621c6a43fa43eb4c6f63bbf87bf7f9\",\"dweb:/ipfs/QmYbf1JaeyjQuF7mNKuVkNe7RJwtdu16XPg5svACmrZsGX\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.33+commit.64118f21"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IMirror","name":"_varaEthProgram","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"UnauthorizedCaller"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32","indexed":false},{"internalType":"bytes","name":"payload","type":"bytes","indexed":false},{"internalType":"bytes4","name":"replyCode","type":"bytes4","indexed":false}],"type":"event","name":"ErrorReplied","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32","indexed":false}],"type":"event","name":"MethodNameReplied","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"VARA_ETH_PROGRAM","outputs":[{"internalType":"contract IMirror","name":"","type":"address"}]},{"inputs":[{"internalType":"bool","name":"isPanic","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"methodName","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"bytes4","name":"replyCode","type":"bytes4"}],"stateMutability":"payable","type":"function","name":"onErrorReply"},{"inputs":[],"stateMutability":"view","type":"function","name":"onErrorReplyCalled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"replyOnMethodNameCalled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"replyOn_methodName"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"replyOn_methodName(bytes32)":{"notice":"forge-lint: disable-next-line(mixed-case-function)"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@symbioticfi/core/=lib/symbiotic-rewards/lib/core/","core/=lib/symbiotic-rewards/lib/core/","ds-test/=lib/symbiotic-core/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","frost-secp256k1-evm/=lib/frost-secp256k1-evm/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/","script/=script/","src/=src/","symbiotic-core/=lib/symbiotic-core/","symbiotic-rewards/=lib/symbiotic-rewards/","test/=test/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"test/DemoCaller.sol":"DemoCaller"},"evmVersion":"osaka","libraries":{},"viaIR":true},"sources":{"lib/frost-secp256k1-evm/src/FROST.sol":{"keccak256":"0x8c8ba97570ce652b50ef98f2625844d38f74313a804afbb494d594249957982b","urls":["bzz-raw://4f1ec027e9311ec16af843df5f79fe48be99b877db752e09910806023948faec","dweb:/ipfs/QmU9Yg7fqxPfrDXjY3fUKhtBz3i8GgesuvXYhxiBMWygHB"],"license":"MIT"},"lib/frost-secp256k1-evm/src/utils/Memory.sol":{"keccak256":"0xe1d67c09eb54744acd7e397129c453860e11b6af20404614955a112f528e5e61","urls":["bzz-raw://e2a71aec4d0d99240d30badcc80fd732e3bc30bc58c0ba289378e9277bacff57","dweb:/ipfs/QmPSwCbje4kpysdmPKpeSnf6ZtcFFyGsjmgum3Chdi2VjA"],"license":"MIT"},"lib/frost-secp256k1-evm/src/utils/cryptography/ECDSA.sol":{"keccak256":"0x53d96c7dd11a8e41a71c3a8e9f25c05755e0d7baeef735ab91f513f3b4d246d8","urls":["bzz-raw://e04c980daeff86fed4415ff707d135b5449e71f075e6243963aed523218ef695","dweb:/ipfs/QmQ6bvEpYX6z8yZieKqHY1T4e8DTRtFqfCfwHXfhrnmJ1c"],"license":"MIT"},"lib/frost-secp256k1-evm/src/utils/cryptography/Hashes.sol":{"keccak256":"0x309133627aa479b060dc680342c5160b83b3dc06242919cf04fbab6bd31a68b0","urls":["bzz-raw://ddafbe0ba7f6f70a9c4a2e231eb427744296fbe46f8d9e43dedda87c6171e5ff","dweb:/ipfs/QmV1NReDo2Qak6W2sZZNAEV1XoLFUrWTJ9UduYka6acMBi"],"license":"MIT"},"lib/frost-secp256k1-evm/src/utils/cryptography/Schnorr.sol":{"keccak256":"0x5689c57b3d75a97638603fa7fddd2774771ba50541c7dbe32874243a36740489","urls":["bzz-raw://684e5c45325f61c730e17cfaa86558136ba2f3c530022ceafda48eb5593d4378","dweb:/ipfs/QmTUPujhSjJRhFDFJY5m2VQa5AYKgW5bUkHXJHWhBkDvzB"],"license":"MIT"},"lib/frost-secp256k1-evm/src/utils/cryptography/Secp256k1.sol":{"keccak256":"0x67e528aa32adcca7fafe401102c34b7dd1b259a74badbfa877dc4f6ab143cd1f","urls":["bzz-raw://978921f8d1f89d4f2ae902274b65055ba2ed4c085e0ec765dbf3bba9121e6bda","dweb:/ipfs/QmUxaMYVi256FjHhAZzQoGS3akM2xpaq2zwMcUbp9Zmrpp"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol":{"keccak256":"0x67672e4ca1dafdcc661d4eba8475cfac631fa0933309258e3af7644b92e1fb26","urls":["bzz-raw://30192451f05ea5ddb0c18bd0f9003f098505836ba19c08a9c365adf829454da2","dweb:/ipfs/QmfCuZSCTyCdFoSKn7MSaN6hZksnQn9ZhrZDAdRTCbwGu2"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4","urls":["bzz-raw://15e3599867c2182f5831e9268b274b2ef2047825837df6b4d81c9e89254b093e","dweb:/ipfs/QmZbL7XAYr5RmaNaooPgZRmcDXaudfsYQfYD9y5iAECvpS"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631","urls":["bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59","dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6","urls":["bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3","dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/ICallbacks.sol":{"keccak256":"0x59b2c459562d95a574b7d578ae7780798034c66d6c8504dcc9d04ad68da2b25a","urls":["bzz-raw://314f3f21da1fb9b985d282d07816b37f03706a12e0cc74f461fffd3ddd3a0e35","dweb:/ipfs/QmXjkU3LXfPzQY7fyyqytxrAjosWBZsMmRvvc62noRAqjp"],"license":"UNLICENSED"},"src/IMirror.sol":{"keccak256":"0xb69ad2881333c466b4c115dce8795ed1f21b52b00fbc929b5d0c76ee336f253b","urls":["bzz-raw://25f1d70354c1b804b0de6c779690401a9043037e26ee8bf0d55bc1bdd0c1a876","dweb:/ipfs/QmS9DmLZHTSovhwyHykzCQf73yie2NBFN5qTEDdBiuAGpg"],"license":"UNLICENSED"},"src/IRouter.sol":{"keccak256":"0xc933ed91b4e3da6b0880841f2423a1e71a9bc49aca6f33aebf6c902a60c146aa","urls":["bzz-raw://c8229438d62a62be114727c59bd0ab8c2e77cfcae6c14ac885c3902661f8c04a","dweb:/ipfs/QmeGw253fSke8BT3c6pvcxke3BYhr7DZCDA8Rd8Fy3QWJF"],"license":"UNLICENSED"},"src/libraries/Gear.sol":{"keccak256":"0xd7c2749012a8bbfcc72b809d7b71fa2fd7fd6a9b3a51b4aaf1f1b8ead14da41c","urls":["bzz-raw://855047154ced953570d98c87823e89b97683f17bcd5b855603a4a022eb63c645","dweb:/ipfs/QmaYJn6peukkWaWQo59qUmSQggyofJYEPChBpZRqXtRakA"],"license":"UNLICENSED"},"test/DemoCaller.sol":{"keccak256":"0xadd6146eed29ba5150cad0f87c9e2cc5c6a9df98b8e30f6250bc9bb55296cef4","urls":["bzz-raw://9ef6db13d6b15d0568f8a8cad1520debbba95bd93e6f4daa3d3d74002e5c7a96","dweb:/ipfs/QmQFRcNbP4BhkMNRQfGWZp7QzMJJRMD4w9QZ2FvDCNp4GP"],"license":"UNLICENSED"},"test/IDemoCallbacks.sol":{"keccak256":"0xdd14693a8a8be3fa24b0bff3c28c685c2ed4c67785474667efab10f92720e00d","urls":["bzz-raw://dcda3e90af031a92e2aca4d1b34444eebf621c6a43fa43eb4c6f63bbf87bf7f9","dweb:/ipfs/QmYbf1JaeyjQuF7mNKuVkNe7RJwtdu16XPg5svACmrZsGX"],"license":"UNLICENSED"}},"version":1},"storageLayout":{"storage":[{"astId":84440,"contract":"test/DemoCaller.sol:DemoCaller","label":"replyOnMethodNameCalled","offset":0,"slot":"0","type":"t_bool"},{"astId":84442,"contract":"test/DemoCaller.sol:DemoCaller","label":"onErrorReplyCalled","offset":1,"slot":"0","type":"t_bool"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"}}},"ast":{"absolutePath":"test/DemoCaller.sol","id":84548,"exportedSymbols":{"DemoCaller":[84547],"IDemoCallbacks":[84560],"IMirror":[73658]},"nodeType":"SourceUnit","src":"39:1430:173","nodes":[{"id":84429,"nodeType":"PragmaDirective","src":"39:24:173","nodes":[],"literals":["solidity","^","0.8",".33"]},{"id":84431,"nodeType":"ImportDirective","src":"65:40:173","nodes":[],"absolutePath":"src/IMirror.sol","file":"src/IMirror.sol","nameLocation":"-1:-1:-1","scope":84548,"sourceUnit":73659,"symbolAliases":[{"foreign":{"id":84430,"name":"IMirror","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":73658,"src":"73:7:173","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84433,"nodeType":"ImportDirective","src":"106:55:173","nodes":[],"absolutePath":"test/IDemoCallbacks.sol","file":"test/IDemoCallbacks.sol","nameLocation":"-1:-1:-1","scope":84548,"sourceUnit":84561,"symbolAliases":[{"foreign":{"id":84432,"name":"IDemoCallbacks","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84560,"src":"114:14:173","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84547,"nodeType":"ContractDefinition","src":"163:1305:173","nodes":[{"id":84438,"nodeType":"VariableDeclaration","src":"207:41:173","nodes":[],"constant":false,"functionSelector":"dab506b2","mutability":"immutable","name":"VARA_ETH_PROGRAM","nameLocation":"232:16:173","scope":84547,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"},"typeName":{"id":84437,"nodeType":"UserDefinedTypeName","pathNode":{"id":84436,"name":"IMirror","nameLocations":["207:7:173"],"nodeType":"IdentifierPath","referencedDeclaration":73658,"src":"207:7:173"},"referencedDeclaration":73658,"src":"207:7:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"visibility":"public"},{"id":84440,"nodeType":"VariableDeclaration","src":"255:35:173","nodes":[],"constant":false,"functionSelector":"d24012f8","mutability":"mutable","name":"replyOnMethodNameCalled","nameLocation":"267:23:173","scope":84547,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":84439,"name":"bool","nodeType":"ElementaryTypeName","src":"255:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"public"},{"id":84442,"nodeType":"VariableDeclaration","src":"296:30:173","nodes":[],"constant":false,"functionSelector":"8ed2570c","mutability":"mutable","name":"onErrorReplyCalled","nameLocation":"308:18:173","scope":84547,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":84441,"name":"bool","nodeType":"ElementaryTypeName","src":"296:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"public"},{"id":84446,"nodeType":"EventDefinition","src":"333:43:173","nodes":[],"anonymous":false,"eventSelector":"e84f069632bb62380c2db01d855c4a504e087d71add44c3639386496f56fcfd2","name":"MethodNameReplied","nameLocation":"339:17:173","parameters":{"id":84445,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84444,"indexed":false,"mutability":"mutable","name":"messageId","nameLocation":"365:9:173","nodeType":"VariableDeclaration","scope":84446,"src":"357:17:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":84443,"name":"bytes32","nodeType":"ElementaryTypeName","src":"357:7:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"356:19:173"}},{"id":84454,"nodeType":"EventDefinition","src":"382:71:173","nodes":[],"anonymous":false,"eventSelector":"71e1710f6581d7e128cb38d25b5ea07b760f138a9073096c50be9c23d0f2b45e","name":"ErrorReplied","nameLocation":"388:12:173","parameters":{"id":84453,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84448,"indexed":false,"mutability":"mutable","name":"messageId","nameLocation":"409:9:173","nodeType":"VariableDeclaration","scope":84454,"src":"401:17:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":84447,"name":"bytes32","nodeType":"ElementaryTypeName","src":"401:7:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":84450,"indexed":false,"mutability":"mutable","name":"payload","nameLocation":"426:7:173","nodeType":"VariableDeclaration","scope":84454,"src":"420:13:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":84449,"name":"bytes","nodeType":"ElementaryTypeName","src":"420:5:173","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":84452,"indexed":false,"mutability":"mutable","name":"replyCode","nameLocation":"442:9:173","nodeType":"VariableDeclaration","scope":84454,"src":"435:16:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":84451,"name":"bytes4","nodeType":"ElementaryTypeName","src":"435:6:173","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"400:52:173"}},{"id":84456,"nodeType":"ErrorDefinition","src":"459:27:173","nodes":[],"errorSelector":"5c427cd9","name":"UnauthorizedCaller","nameLocation":"465:18:173","parameters":{"id":84455,"nodeType":"ParameterList","parameters":[],"src":"483:2:173"}},{"id":84467,"nodeType":"FunctionDefinition","src":"492:88:173","nodes":[],"body":{"id":84466,"nodeType":"Block","src":"529:51:173","nodes":[],"statements":[{"expression":{"id":84464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":84462,"name":"VARA_ETH_PROGRAM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84438,"src":"539:16:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":84463,"name":"_varaEthProgram","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84459,"src":"558:15:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"src":"539:34:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"id":84465,"nodeType":"ExpressionStatement","src":"539:34:173"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":84460,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84459,"mutability":"mutable","name":"_varaEthProgram","nameLocation":"512:15:173","nodeType":"VariableDeclaration","scope":84467,"src":"504:23:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"},"typeName":{"id":84458,"nodeType":"UserDefinedTypeName","pathNode":{"id":84457,"name":"IMirror","nameLocations":["504:7:173"],"nodeType":"IdentifierPath","referencedDeclaration":73658,"src":"504:7:173"},"referencedDeclaration":73658,"src":"504:7:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"visibility":"internal"}],"src":"503:25:173"},"returnParameters":{"id":84461,"nodeType":"ParameterList","parameters":[],"src":"529:0:173"},"scope":84547,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":84474,"nodeType":"ModifierDefinition","src":"586:79:173","nodes":[],"body":{"id":84473,"nodeType":"Block","src":"616:49:173","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":84469,"name":"_onlyVaraEthProgram","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84490,"src":"626:19:173","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":84470,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"626:21:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":84471,"nodeType":"ExpressionStatement","src":"626:21:173"},{"id":84472,"nodeType":"PlaceholderStatement","src":"657:1:173"}]},"name":"onlyVaraEthProgram","nameLocation":"595:18:173","parameters":{"id":84468,"nodeType":"ParameterList","parameters":[],"src":"613:2:173"},"virtual":false,"visibility":"internal"},{"id":84490,"nodeType":"FunctionDefinition","src":"671:158:173","nodes":[],"body":{"id":84489,"nodeType":"Block","src":"716:113:173","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":84483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":84477,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"730:3:173","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":84478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"734:6:173","memberName":"sender","nodeType":"MemberAccess","src":"730:10:173","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":84481,"name":"VARA_ETH_PROGRAM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84438,"src":"752:16:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}],"id":84480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"744:7:173","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":84479,"name":"address","nodeType":"ElementaryTypeName","src":"744:7:173","typeDescriptions":{}}},"id":84482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"744:25:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"730:39:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":84488,"nodeType":"IfStatement","src":"726:97:173","trueBody":{"id":84487,"nodeType":"Block","src":"771:52:173","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":84484,"name":"UnauthorizedCaller","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84456,"src":"792:18:173","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":84485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"792:20:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":84486,"nodeType":"RevertStatement","src":"785:27:173"}]}}]},"implemented":true,"kind":"function","modifiers":[],"name":"_onlyVaraEthProgram","nameLocation":"680:19:173","parameters":{"id":84475,"nodeType":"ParameterList","parameters":[],"src":"699:2:173"},"returnParameters":{"id":84476,"nodeType":"ParameterList","parameters":[],"src":"716:0:173"},"scope":84547,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":84507,"nodeType":"FunctionDefinition","src":"835:146:173","nodes":[],"body":{"id":84506,"nodeType":"Block","src":"896:85:173","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"id":84501,"name":"isPanic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84492,"src":"959:7:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":84499,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"942:3:173","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":84500,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"946:12:173","memberName":"encodePacked","nodeType":"MemberAccess","src":"942:16:173","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":84502,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"942:25:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"74727565","id":84503,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"969:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":84497,"name":"VARA_ETH_PROGRAM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84438,"src":"913:16:173","typeDescriptions":{"typeIdentifier":"t_contract$_IMirror_$73658","typeString":"contract IMirror"}},"id":84498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"930:11:173","memberName":"sendMessage","nodeType":"MemberAccess","referencedDeclaration":73620,"src":"913:28:173","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes_memory_ptr_$_t_bool_$returns$_t_bytes32_$","typeString":"function (bytes memory,bool) payable external returns (bytes32)"}},"id":84504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"913:61:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":84496,"id":84505,"nodeType":"Return","src":"906:68:173"}]},"functionSelector":"96b3d5a9","implemented":true,"kind":"function","modifiers":[],"name":"methodName","nameLocation":"844:10:173","parameters":{"id":84493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84492,"mutability":"mutable","name":"isPanic","nameLocation":"860:7:173","nodeType":"VariableDeclaration","scope":84507,"src":"855:12:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":84491,"name":"bool","nodeType":"ElementaryTypeName","src":"855:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"854:14:173"},"returnParameters":{"id":84496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84495,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":84507,"src":"887:7:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":84494,"name":"bytes32","nodeType":"ElementaryTypeName","src":"887:7:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"886:9:173"},"scope":84547,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":84524,"nodeType":"FunctionDefinition","src":"1046:166:173","nodes":[],"body":{"id":84523,"nodeType":"Block","src":"1121:91:173","nodes":[],"statements":[{"expression":{"id":84517,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":84515,"name":"replyOnMethodNameCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84440,"src":"1131:23:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":84516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1157:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"1131:30:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":84518,"nodeType":"ExpressionStatement","src":"1131:30:173"},{"eventCall":{"arguments":[{"id":84520,"name":"messageId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84510,"src":"1195:9:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":84519,"name":"MethodNameReplied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84446,"src":"1177:17:173","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$returns$__$","typeString":"function (bytes32)"}},"id":84521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1177:28:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":84522,"nodeType":"EmitStatement","src":"1172:33:173"}]},"baseFunctions":[84559],"documentation":{"id":84508,"nodeType":"StructuredDocumentation","src":"987:54:173","text":"forge-lint: disable-next-line(mixed-case-function)"},"functionSelector":"b52ab555","implemented":true,"kind":"function","modifiers":[{"id":84513,"kind":"modifierInvocation","modifierName":{"id":84512,"name":"onlyVaraEthProgram","nameLocations":["1102:18:173"],"nodeType":"IdentifierPath","referencedDeclaration":84474,"src":"1102:18:173"},"nodeType":"ModifierInvocation","src":"1102:18:173"}],"name":"replyOn_methodName","nameLocation":"1055:18:173","parameters":{"id":84511,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84510,"mutability":"mutable","name":"messageId","nameLocation":"1082:9:173","nodeType":"VariableDeclaration","scope":84524,"src":"1074:17:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":84509,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1074:7:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1073:19:173"},"returnParameters":{"id":84514,"nodeType":"ParameterList","parameters":[],"src":"1121:0:173"},"scope":84547,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":84546,"nodeType":"FunctionDefinition","src":"1218:248:173","nodes":[],"body":{"id":84545,"nodeType":"Block","src":"1365:101:173","nodes":[],"statements":[{"expression":{"id":84537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":84535,"name":"onErrorReplyCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84442,"src":"1375:18:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":84536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1396:4:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"1375:25:173","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":84538,"nodeType":"ExpressionStatement","src":"1375:25:173"},{"eventCall":{"arguments":[{"id":84540,"name":"messageId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84526,"src":"1429:9:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":84541,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84528,"src":"1440:7:173","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":84542,"name":"replyCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84530,"src":"1449:9:173","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":84539,"name":"ErrorReplied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84454,"src":"1416:12:173","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes4_$returns$__$","typeString":"function (bytes32,bytes memory,bytes4)"}},"id":84543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1416:43:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":84544,"nodeType":"EmitStatement","src":"1411:48:173"}]},"baseFunctions":[73042],"functionSelector":"4a646c7f","implemented":true,"kind":"function","modifiers":[{"id":84533,"kind":"modifierInvocation","modifierName":{"id":84532,"name":"onlyVaraEthProgram","nameLocations":["1342:18:173"],"nodeType":"IdentifierPath","referencedDeclaration":84474,"src":"1342:18:173"},"nodeType":"ModifierInvocation","src":"1342:18:173"}],"name":"onErrorReply","nameLocation":"1227:12:173","parameters":{"id":84531,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84526,"mutability":"mutable","name":"messageId","nameLocation":"1248:9:173","nodeType":"VariableDeclaration","scope":84546,"src":"1240:17:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":84525,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1240:7:173","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":84528,"mutability":"mutable","name":"payload","nameLocation":"1274:7:173","nodeType":"VariableDeclaration","scope":84546,"src":"1259:22:173","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":84527,"name":"bytes","nodeType":"ElementaryTypeName","src":"1259:5:173","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":84530,"mutability":"mutable","name":"replyCode","nameLocation":"1290:9:173","nodeType":"VariableDeclaration","scope":84546,"src":"1283:16:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":84529,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1283:6:173","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1239:61:173"},"returnParameters":{"id":84534,"nodeType":"ParameterList","parameters":[],"src":"1365:0:173"},"scope":84547,"stateMutability":"payable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":84434,"name":"IDemoCallbacks","nameLocations":["186:14:173"],"nodeType":"IdentifierPath","referencedDeclaration":84560,"src":"186:14:173"},"id":84435,"nodeType":"InheritanceSpecifier","src":"186:14:173"}],"canonicalName":"DemoCaller","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[84547,84560,73043],"name":"DemoCaller","nameLocation":"172:10:173","scope":84548,"usedErrors":[84456],"usedEvents":[84446,84454]}],"license":"UNLICENSED"},"id":173}
\ No newline at end of file
diff --git a/ethexe/ethereum/src/abi/mod.rs b/ethexe/ethereum/src/abi/mod.rs
index 4f13d09285b..35cabf3d698 100644
--- a/ethexe/ethereum/src/abi/mod.rs
+++ b/ethexe/ethereum/src/abi/mod.rs
@@ -61,6 +61,12 @@ sol!(
"abi/WrappedVara.json"
);
+sol!(
+ #[sol(rpc)]
+ IDemoCaller,
+ "abi/DemoCaller.json"
+);
+
/// Bindings for Symbiotic contracts.
/// Only uses for local deployments and tests.
pub mod symbiotic_abi {
diff --git a/ethexe/service/Cargo.toml b/ethexe/service/Cargo.toml
index a7d69db080f..4f8b58656c0 100644
--- a/ethexe/service/Cargo.toml
+++ b/ethexe/service/Cargo.toml
@@ -79,6 +79,7 @@ demo-async = { workspace = true, features = ["debug", "ethexe"] }
demo-async-init = { workspace = true, features = ["debug", "ethexe"] }
demo-mul-by-const = { workspace = true, features = ["debug"] }
demo-piggy-bank = { workspace = true, features = ["debug", "ethexe"] }
+demo-reply-callback = { workspace = true, features = ["debug", "ethexe"] }
demo-fungible-token = { workspace = true }
demo-delayed-sender-ethexe = { workspace = true, features = [
"debug",
diff --git a/ethexe/service/src/tests/mod.rs b/ethexe/service/src/tests/mod.rs
index a02f55aaae4..629fad981b0 100644
--- a/ethexe/service/src/tests/mod.rs
+++ b/ethexe/service/src/tests/mod.rs
@@ -52,7 +52,9 @@ use ethexe_common::{
use ethexe_compute::{ComputeConfig, ComputeEvent};
use ethexe_consensus::{BatchCommitter, ConsensusEvent};
use ethexe_db::verifier::IntegrityVerifier;
-use ethexe_ethereum::{TryGetReceipt, deploy::ContractsDeploymentParams, router::Router};
+use ethexe_ethereum::{
+ TryGetReceipt, abi::IDemoCaller, deploy::ContractsDeploymentParams, router::Router,
+};
use ethexe_observer::{EthereumConfig, ObserverEvent};
use ethexe_prometheus::PrometheusConfig;
use ethexe_rpc::{DEFAULT_BLOCK_GAS_LIMIT_MULTIPLIER, InjectedClient, RpcConfig};
@@ -3388,3 +3390,99 @@ async fn catch_up_test_case(commitment_delay_limit: u32) {
unreachable!();
}
}
+
+#[tokio::test(flavor = "multi_thread")]
+#[ntest::timeout(60_000)]
+async fn reply_callback() {
+ init_logger();
+
+ let mut env = TestEnv::new(Default::default()).await.unwrap();
+
+ let mut node = env.new_node(NodeConfig::default().validator(env.validators[0]));
+ node.start_service().await;
+
+ let res = env
+ .upload_code(demo_reply_callback::WASM_BINARY)
+ .await
+ .unwrap()
+ .wait_for()
+ .await
+ .unwrap();
+ assert!(res.valid);
+
+ let code_id = res.code_id;
+
+ let code = node
+ .db
+ .original_code(code_id)
+ .expect("After approval, the code is guaranteed to be in the database");
+ assert_eq!(code, demo_reply_callback::WASM_BINARY);
+
+ let _ = node
+ .db
+ .instrumented_code(1, code_id)
+ .expect("After approval, instrumented code is guaranteed to be in the database");
+ let res = env
+ .create_program(code_id, 500_000_000_000_000)
+ .await
+ .unwrap()
+ .wait_for()
+ .await
+ .unwrap();
+ assert_eq!(res.code_id, code_id);
+
+ let res = env
+ .send_message(res.program_id, b"")
+ .await
+ .unwrap()
+ .wait_for()
+ .await
+ .unwrap();
+
+ assert_eq!(res.code, ReplyCode::Success(SuccessReplyReason::Auto));
+ assert_eq!(res.payload, b"");
+ assert_eq!(res.value, 0);
+
+ let program_id = res.program_id;
+
+ let provider = env.ethereum.provider();
+ let demo_caller = IDemoCaller::deploy(provider.clone(), program_id.into())
+ .await
+ .expect("deploying DemoCaller failed");
+
+ assert!(!demo_caller.replyOnMethodNameCalled().call().await.unwrap());
+
+ demo_caller
+ .methodName(false)
+ .send()
+ .await
+ .unwrap()
+ .try_get_receipt()
+ .await
+ .unwrap();
+
+ env.new_observer_events()
+ .filter_map_block_synced()
+ .find(|e| matches!(e, BlockEvent::Router(RouterEvent::BatchCommitted { .. })))
+ .await;
+
+ assert!(demo_caller.replyOnMethodNameCalled().call().await.unwrap());
+
+ assert!(!demo_caller.onErrorReplyCalled().call().await.unwrap());
+
+ demo_caller
+ .methodName(true)
+ .send()
+ .await
+ .unwrap()
+ .try_get_receipt()
+ .await
+ .unwrap();
+
+ env.new_observer_events()
+ .filter_map_block_synced()
+ .find(|e| matches!(e, BlockEvent::Router(RouterEvent::BatchCommitted { .. })))
+ .await;
+
+ assert!(demo_caller.onErrorReplyCalled().call().await.unwrap());
+}
diff --git a/examples/reply-callback/Cargo.toml b/examples/reply-callback/Cargo.toml
new file mode 100644
index 00000000000..fd52c91ff86
--- /dev/null
+++ b/examples/reply-callback/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "demo-reply-callback"
+version = "0.1.0"
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+homepage.workspace = true
+repository.workspace = true
+
+[dependencies]
+gstd.workspace = true
+gear-workspace-hack.workspace = true
+
+[build-dependencies]
+gear-wasm-builder.workspace = true
+
+[features]
+debug = ["gstd/debug"]
+default = ["std"]
+std = []
+ethexe = ["gstd/ethexe"]
diff --git a/examples/reply-callback/build.rs b/examples/reply-callback/build.rs
new file mode 100644
index 00000000000..1024b4832a6
--- /dev/null
+++ b/examples/reply-callback/build.rs
@@ -0,0 +1,21 @@
+// This file is part of Gear.
+
+// Copyright (C) 2021-2025 Gear Technologies Inc.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+fn main() {
+ gear_wasm_builder::build();
+}
diff --git a/examples/reply-callback/src/lib.rs b/examples/reply-callback/src/lib.rs
new file mode 100644
index 00000000000..365f2084c76
--- /dev/null
+++ b/examples/reply-callback/src/lib.rs
@@ -0,0 +1,30 @@
+// This file is part of Gear.
+
+// Copyright (C) 2026 Gear Technologies Inc.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+#![no_std]
+
+#[cfg(feature = "std")]
+mod code {
+ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
+}
+
+#[cfg(feature = "std")]
+pub use code::WASM_BINARY_OPT as WASM_BINARY;
+
+#[cfg(not(feature = "std"))]
+mod wasm;
diff --git a/examples/reply-callback/src/wasm.rs b/examples/reply-callback/src/wasm.rs
new file mode 100644
index 00000000000..5aa91816d5f
--- /dev/null
+++ b/examples/reply-callback/src/wasm.rs
@@ -0,0 +1,41 @@
+// This file is part of Gear.
+
+// Copyright (C) 2026 Gear Technologies Inc.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+use gstd::{msg, prelude::*};
+
+#[unsafe(no_mangle)]
+extern "C" fn init() {}
+
+#[unsafe(no_mangle)]
+extern "C" fn handle() {
+ let payload = msg::load_bytes().expect("Failed to load payload");
+ let is_panic = payload[0] == 0x01;
+
+ if is_panic {
+ panic!();
+ } else {
+ let message_id = msg::id().into_bytes();
+
+ // cast calldata "function replyOn_methodName(bytes32 messageId) external" "0x..."
+ let mut payload = [0u8; 36];
+ payload[..4].copy_from_slice(&[0xb5, 0x2a, 0xb5, 0x55]); // DemoCaller.replyOn_methodName.selector
+ payload[4..].copy_from_slice(&message_id);
+
+ msg::reply_bytes(payload, 0).expect("Failed to send reply");
+ }
+}