contract-guide
4
总安装量
4
周安装量
#47770
全站排名
安装命令
npx skills add https://github.com/restorenode/hackathon-skills --skill contract-guide
Agent 安装分布
amp
4
opencode
4
kimi-cli
4
codex
4
github-copilot
4
gemini-cli
4
Skill 文档
Contract Guide Skill
This skill provides expert guidance for writing smart contracts on Initia. It helps identify the correct libraries, naming conventions, and deployment patterns for Move, Wasm, and EVM.
MoveVM
Project Structure
A typical MoveVM project on Initia has the following structure:
.
âââ Move.toml
âââ sources
âââ *.move
Move.toml: The manifest file that defines the project’s metadata, dependencies, and addresses.sources/: The directory containing the Move source code files.
Key Libraries and Dependencies
- InitiaStdlib: The standard library for Initia Move modules. It is typically included as a dependency in
Move.toml:[dependencies] InitiaStdlib = { git = "https://github.com/initia-labs/movevm.git", subdir = "precompile/modules/initia_stdlib", rev = "main" }
Naming Conventions
- Modules and Functions:
snake_case(e.g.,module my_module,fun my_function).
Example: Oracle Integration
Here is an example of a Move module that interacts with an oracle:
module example::oracle_example {
use std::string::String;
use initia_std::oracle::get_price;
#[view]
public fun get_price_example(pair_id: String): (u256, u64, u64) {
let (price, timestamp, decimals) = get_price(pair_id);
(price, timestamp, decimals)
}
#[test]
public fun test_get_price_example(): (u256, u64, u64) {
let btc_usd_pair_id = string::utf8(b"BITCOIN/USD");
let (price, timestamp, decimals) = get_price_example(btc_usd_pair_id);
(price, timestamp, decimals)
}
}
WasmVM (CosmWasm)
Project Structure
A typical WasmVM project on Initia follows the standard CosmWasm project structure:
.
âââ Cargo.toml
âââ src
âââ lib.rs
âââ contract.rs
âââ msg.rs
âââ state.rs
âââ error.rs
Key Libraries and Dependencies
- cosmwasm-std: The standard library for CosmWasm contracts.
- cw-storage-plus: A library for managing contract storage.
- slinky_wasm: A specific library for interacting with Initia’s oracle.
Example Cargo.toml dependencies:
[dependencies]
cosmwasm-schema = "2.0.1"
cosmwasm-std = { version = "2.0.1", features = ["cosmwasm_1_3"] }
cw-storage-plus = "2.0.0"
cw2 = "2.0.0"
schemars = "0.8.16"
serde = { version = "1.0.197", default-features = false, features = ["derive"] }
thiserror = { version = "1.0.58" }
slinky_wasm = { path = "packages/slinky_wasm" }
Coding Patterns
- Entry Points: Use the standard
#[entry_point]macro forinstantiate,execute, andqueryfunctions. - Oracle Integration: Use the
slinky_wasmlibrary to query the oracle. Queries are made usingQueryRequest::Wasm(WasmQuery::Smart { ... }).
Example: Oracle Query
pub mod query {
use cosmwasm_std::{QueryRequest, WasmQuery};
use slinky_wasm::oracle::GetAllCurrencyPairsResponse;
// ...
pub fn example_get_price(deps: Deps) -> StdResult<GetPriceResponse> {
let state = STATE.load(deps.storage)?;
let slinky_addr = state.slinky;
let base_asset = "BTC";
let quote_asset = "USD";
deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart {
contract_addr: slinky_addr.to_string(),
msg: to_json_binary(&slinky_wasm::oracle::QueryMsg::GetPrice {
base: base_asset.to_string(),
quote: quote_asset.to_string(),
})?,
}))
}
}
EVM (Solidity)
Project Structure
A typical EVM project on Initia uses the Foundry toolchain:
.
âââ foundry.toml
âââ src
â âââ *.sol
âââ lib
âââ script
Key Libraries and Dependencies
- initia-evm-contracts: The key library for Initia EVM development. It is usually included as a git submodule in the
libdirectory.
Coding Patterns
- Oracle Integration: Use the
ISlinkyinterface frominitia-evm-contractsto interact with the oracle.
Naming Conventions
- Functions:
snake_case - Variables:
camelCase
Example: Oracle Integration
pragma solidity ^0.8.24;
import "initia-evm-contracts/src/interfaces/ISlinky.sol";
contract Oracle {
ISlinky immutable public slinky;
constructor (address _slinky) {
slinky = ISlinky(_slinky);
}
function oracle_get_price() external {
string memory base = "BTC";
string memory quote = "USD";
price = slinky.get_price(base, quote);
}
}