// SPDX-License-Identifier: UNLICENSED
pragma solidity ^{{pragma_version}};
interface I{{contract_name}} {
{{#each events}}
event {{name}}({{#each args}}{{#if @index}}, {{/if}}{{ty}}{{#if indexed}} indexed{{/if}}{{#if name}} {{name}}{{/if}}{{/each}});
{{/each}}
{{#each functions}}
{{#if @index}}
{{/if}}
function {{name}}(bool _callReply{{#if args}}, {{#each args}}{{#if @index}}, {{/if}}{{ty}}{{#if mem_location}} {{mem_location}}{{/if}} {{name}}{{/each}}{{/if}}) external{{#if payable}} payable{{/if}} returns (bytes32 messageId);
{{/each}}
}
contract {{contract_name}}Abi is I{{contract_name}} {
{{#each functions}}
{{#if @index}}
{{/if}}
function {{name}}(bool _callReply{{#if args}}, {{#each args}}{{#if @index}}, {{/if}}{{ty}}{{#if mem_location}} {{mem_location}}{{/if}} {{name}}{{/each}}{{/if}}) external{{#if payable}} payable{{/if}} returns (bytes32 messageId) {}
{{/each}}
}
interface I{{contract_name}}Callbacks {
{{#each functions}}
function replyOn_{{name}}(bytes32 messageId{{#if reply_type}}, {{reply_type}} reply{{/if}}) external{{#if returns_value}} payable{{/if}};
{{/each}}
function onErrorReply(bytes32 messageId, bytes calldata payload, bytes4 replyCode) external payable;
}
contract {{contract_name}}Caller is I{{contract_name}}Callbacks {
I{{contract_name}} public immutable VARA_ETH_PROGRAM;
error UnauthorizedCaller();
constructor(I{{contract_name}} _varaEthProgram) {
VARA_ETH_PROGRAM = _varaEthProgram;
}
modifier onlyVaraEthProgram() {
_onlyVaraEthProgram();
_;
}
function _onlyVaraEthProgram() internal view {
if (msg.sender != address(VARA_ETH_PROGRAM)) {
revert UnauthorizedCaller();
}
}
{{#each functions}}
function replyOn_{{name}}(bytes32 messageId{{#if reply_type}}, {{reply_type}} reply{{/if}}) external{{#if returns_value}} payable{{/if}} onlyVaraEthProgram {
// TODO: implement this
}
{{/each}}
function onErrorReply(bytes32 messageId, bytes calldata payload, bytes4 replyCode) external payable onlyVaraEthProgram {
// TODO: implement this
}
}