// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "../src/Exchange.sol"; // 包含 IExchangeModule 接口
import "../src/ExchangeTypes.sol"; // 包含必要的结构如 DerivativeOrder
contract ExchangeDemo {
address constant exchangeContract = 0x0000000000000000000000000000000000000065;
IExchangeModule exchange = IExchangeModule(exchangeContract);
/***************************************************************************
* 直接调用 precompile(合约代表自己操作)
****************************************************************************/
/**
* @notice 将资金从合约余额存入其交易所子账户之一。
* @param subaccountID 目标子账户 ID(从合约地址派生)。
* @param denom 要存入的资产面额(例如 "inj")。
* @param amount 要存入的资产数量。
* @return success 表示存款是否成功的布尔值。
*/
function deposit(
string calldata subaccountID,
string calldata denom,
uint256 amount
) external returns (bool) {
try exchange.deposit(address(this), subaccountID, denom, amount) returns (bool success) {
return success;
} catch Error(string memory reason) {
revert(string(abi.encodePacked("Deposit error: ", reason)));
} catch {
revert("Unknown error during deposit");
}
}
/**
* @notice 从合约的交易所子账户之一提取资金到其主余额。
* @param subaccountID 源子账户 ID。
* @param denom 要提取的资产面额。
* @param amount 要提取的资产数量。
* @return success 表示提款是否成功的布尔值。
*/
function withdraw(
string calldata subaccountID,
string calldata denom,
uint256 amount
) external returns (bool) {
try exchange.withdraw(address(this), subaccountID, denom, amount) returns (bool success) {
return success;
} catch Error(string memory reason) {
revert(string(abi.encodePacked("Withdraw error: ", reason)));
} catch {
revert("Unknown error during withdraw");
}
}
/**
* @notice 查询此合约给定子账户的衍生品持仓。
* @param subaccountID 要查询的子账户 ID。
* @return positions DerivativePosition 结构数组。
*/
function subaccountPositions(
string calldata subaccountID
) external view returns (IExchangeModule.DerivativePosition[] memory positions) {
// 注意:调用 precompiles 的 view 函数可能根据节点配置表现不同
// 对于链上状态,这没问题。对于链下查询,通常首选直接 gRPC/API 查询。
return exchange.subaccountPositions(subaccountID);
}
/**
* @notice 从合约的子账户创建新的衍生品限价订单。
* @param order 包含订单详情的 DerivativeOrder 结构。
* @return response 包含订单哈希等详情的响应结构。
*/
function createDerivativeLimitOrder(
IExchangeModule.DerivativeOrder calldata order
) external returns (IExchangeModule.CreateDerivativeLimitOrderResponse memory response) {
try exchange.createDerivativeLimitOrder(address(this), order) returns (IExchangeModule.CreateDerivativeLimitOrderResponse memory resp) {
return resp;
} catch Error(string memory reason) {
revert(string(abi.encodePacked("CreateDerivativeLimitOrder error: ", reason)));
} catch {
revert("Unknown error during createDerivativeLimitOrder");
}
}
}