Развертывание обменного контракта

Контракт на обмен входит в состав CosmWasm и использует функциональные возможности модуля dex Sei.

Разработка контракта

Чтобы увеличить эффективность модуля dex Sei используется встроенный контракт CosmWasm, который призван реализовать четыре основных интерфейса SudoMsg:

SudoMsg::BulkOrderPlacements

Этот эндпоинт получает ордера, упакованные в текущий блок на dex Sei и должна вернуть номер ордера, который не подходит под условия контракта:

// запрос
BulkOrderPlacements {
    orders: Vec<OrderPlacement>,
    deposits: Vec<DepositInfo>,
}
// ответ
pub struct BulkOrderPlacementsResponse {
    pub unsuccessful_orders: Vec<UnsuccessfulOrder>,
}

SudoMsg::BulkOrderCancellation

Этот эндпоинт получает ордера, отмененные в текущем блоке Sei dex.

// запрос
BulkOrderCancellations {
    ids: Vec<u64>,
}

SudoMsg::Settlement

Этот эндпоинт получает ордера, помещенные в текущий блок на Sei dex. В ответ ничего не возвращает.

// запрос
Settlement {
    epoch: i64,
    entries: Vec<SettlementEntry>,
}

SudoMsg::NewBlock

Эндпоинт получает последнюю эпоху при создании каждого нового блока.

// запрос
NewBlock {
    epoch: i64,
}

SudoMsg::FinalizeBlock

Этот эндпоинт получает результаты размещения ордера только для ордеров, отправленных этим контрактом. Также, обратите внимание, что этот эндпоинт не нужен, если контракт не зарегистрирован как NeedHook в модуле dex.

// запрос
FinalizeBlock {
    contract_order_results: Vec<ContractOrderResult>,
}

Определение типов данных (официальные библиотеки Sei для этих типов находятся в разработке):

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SudoMsg {
    Settlement {
        epoch: i64,
        entries: Vec<SettlementEntry>,
    },

    SetFundingPaymentRate {
        epoch: i64,
        asset_denom: String,
        price_diff: Decimal,
        negative: bool,
    },

    BulkOrderPlacements {
        orders: Vec<OrderPlacement>,
        deposits: Vec<DepositInfo>,
    },

    BulkOrderCancellations {
        cancellations: Vec<OrderCancellation>,
    },

    Liquidation {
        requests: Vec<LiquidationRequest>,
    },
}

#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
pub struct BulkOrderPlacementsResponse {
    pub unsuccessful_order_ids: Vec<u64>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct SettlementEntry {
    pub account: String,
    pub price_denom: String,
    pub asset_denom: String,
    pub quantity: Decimal,
    pub execution_cost_or_proceed: Decimal,
    pub expected_cost_or_proceed: Decimal,
    pub position_direction: PositionDirection,
    pub order_type: OrderType,
    pub order_id: u64,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct OrderPlacement {
    pub id: u64,
    pub status: i32,
    pub account: String,
    pub contract_address: String,
    pub price_denom: String,
    pub asset_denom: String,
    pub price: Decimal,
    pub quantity: Decimal,
    pub order_type: i32,
    pub position_direction: i32,
    pub data: String,
    pub status_description: String,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct DepositInfo {
    pub account: String,
    pub denom: String,
    pub amount: Decimal,
}

Ответ является объектом вида BulkOrderPlacementsResponse и требует сериализации в качестве JSON строки, а после кодируется в base64:

let response = BulkOrderPlacementsResponse{...};
let serialized_json = serde_json::to_string(&response).unwrap();
let base64_json_str = base64::encode(serialized_json);
let binary = Binary::from_base64(base64_json_str.as_ref()).unwrap();

let mut response: Response = Response::new();
response = response.set_data(binary);

К запросам и исполнению эндпоинтов не применяется каких-либо специальных требований. Рекомендуется свести к минимуму использование команды execute и встроить большую часть логики обмена в вышеупомянутые эндпоинты по соображениям производительности.

Разработка/Загрузка/Развертывание контрактов

Используйте инструкцию из раздела "Развертывание универсального контракта".

Регистрация контракта при помощи модуля Dex

Для того, чтобы полноценно использовать возможности модуля dex, необходимо зарегистрировать ваш контракт при помощи этого модуля. Чтобы это сделать, необходимо отправить транзакцию register-contract в модуль dex. Шаблон данной команды:

register-contract [contract address] [code id] [need hook] [need order matching] [dependency1,dependency2,…]

Пример:

seid tx dex register-contract sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr 1 true true -y --from=bob --chain-id=sei-chain --fees=10000000ust --gas=500000 --broadcast-mode=block

Обратите внимание на две булевы переменные в транзакции:

  • NeedHook

  • NeedOrderMatching

Sei Cosmwasm

Sei cosmwasm крэйт предоставляет Sei возможность осуществлять специфические связки с контрактом на cosmwasm и возможность взаимодействовать с блокчейном посредством отправки специальных сообщений, запросов и структур, которые соответствуют функциональным возможностям пользовательских модулей в блокчейне Sei. Контракты могут импортировать последнюю версию крэйта и напрямую взаимодействовать с различными модулями Sei.

Last updated