andromedaprotocol / andromeda-core

Operating System and ADO Smart Contracts
https://andromedaprotocol.io/
38 stars 27 forks source link

Graph ADO (version 1.1.0) and Point ADO #576

Open mdjakovic0920 opened 3 weeks ago

mdjakovic0920 commented 3 weeks ago

1. Graph ADO

Motivation

The purpose of this ADO is to store X-Y coordinates into specific map. The map bounds or limits to where points can be stored. And also it contains decimals and allow/disallow negative numbers.

At version 1.1.0 store_user_coordinate method is added. This function references the user coordinate from Point ADO.

Implementation

#[andr_instantiate]
#[cw_serde]
pub struct InstantiateMsg {
    pub map_info: MapInfo,
}

#[cw_serde]
pub struct MapInfo {
    pub map_size: MapSize,
    pub allow_negative: bool,
    pub map_decimal: u16,
}

#[cw_serde]
pub struct MapSize {
    pub x_width: u64,
    pub y_width: u64,
    pub z_width: Option<u64>,
}

#[andr_exec]
#[cw_serde]
pub enum ExecuteMsg {
    UpdateMap {
        map_info: MapInfo,
    },
    StoreCoordinate {
        coordinate: Coordinate,
        is_timestamp_allowed: bool,
    },
    StoreUserCoordinate {
        user_location_paths: Vec<AndrAddr>,
    },
    DeleteUserCoordinate {
        user: AndrAddr,
    },
}

#[cw_serde]
pub struct Coordinate {
    pub x_coordinate: f64,
    pub y_coordinate: f64,
    pub z_coordinate: Option<f64>,
}

#[andr_query]
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
    #[returns(GetMapInfoResponse)]
    GetMapInfo {},
    #[returns(GetMaxPointNumberResponse)]
    GetMaxPointNumber {},
    #[returns(GetAllPointsResponse)]
    GetAllPoints {},
    #[returns(CoordinateInfo)]
    GetUserCoordinate { user: AndrAddr },
}

#[cw_serde]
pub struct GetMapInfoResponse {
    pub map_info: MapInfo,
}

#[cw_serde]
pub struct GetMaxPointNumberResponse {
    pub max_point_number: u128,
}

#[cw_serde]
pub struct GetAllPointsResponse {
    pub points: Vec<(CoordinateInfo, StoredDate)>,
}

#[cw_serde]
pub struct CoordinateInfo {
    pub x: String,
    pub y: String,
    pub z: Option<String>,
}

#[cw_serde]
pub struct StoredDate {
    pub timestamp: Option<u64>,
}

2. Point ADO

Motivation

The purpose of this ADO is to store x, y, z coordinate.

Implementation

#[andr_instantiate]
#[cw_serde]
pub struct InstantiateMsg {
    pub restriction: PointRestriction,
}

#[andr_exec]
#[cw_serde]
pub enum ExecuteMsg {
    SetPoint { point: PointCoordinate },
    DeletePoint {},
    UpdateRestriction { restriction: PointRestriction },
}

#[cw_serde]
pub enum PointRestriction {
    Private,
    Public,
    Restricted,
}

#[cw_serde]
pub struct PointCoordinate {
    pub x_coordinate: String,
    pub y_coordinate: String,
    pub z_coordinate: Option<String>,
}

impl PointCoordinate {
    pub fn from_f64(x_coordinate: f64, y_coordinate: f64, z_coordinate: Option<f64>) -> Self {
        let z_coordinate: Option<String> = z_coordinate.map(|z| z.to_string());

        Self {
            x_coordinate: x_coordinate.to_string(),
            y_coordinate: y_coordinate.to_string(),
            z_coordinate,
        }
    }
    pub fn validate(&self) -> Result<(), ContractError> {
        let x_coordinate = self.x_coordinate.parse::<f64>();
        if x_coordinate.is_err() {
            return Err(ContractError::ParsingError {
                err: "x_coordinate: can not parse to f64".to_string(),
            });
        }

        let y_coordinate = self.y_coordinate.parse::<f64>();
        if y_coordinate.is_err() {
            return Err(ContractError::ParsingError {
                err: "y_coordinate: can not parse to f64".to_string(),
            });
        }

        match &self.z_coordinate {
            None => (),
            Some(z) => {
                let z_coordinate = z.parse::<f64>();
                if z_coordinate.is_err() {
                    return Err(ContractError::ParsingError {
                        err: "z_coordinate: can not parse to f64".to_string(),
                    });
                }
            }
        }
        Ok(())
    }
}

#[andr_query]
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
    #[returns(PointCoordinate)]
    GetPoint {},
    #[returns(GetDataOwnerResponse)]
    GetDataOwner {},
}

#[cw_serde]
pub struct GetDataOwnerResponse {
    pub owner: AndrAddr,
}

Summary by CodeRabbit

coderabbitai[bot] commented 3 weeks ago

Walkthrough

The pull request introduces extensive updates to the Andromeda data storage project, including new modules for managing maps and coordinates, enhancements to existing ADOs, and improvements to the permissioning system. It features the addition of various ADOs, enums, and queries, alongside a comprehensive smart contract implementation for the Andromeda Graph module. Testing utilities and mock implementations have been added to support robust testing. The changes also address multiple bugs and refine existing functionalities, contributing to a more efficient framework for data management.

Changes

File Path Change Summary
CHANGELOG.md Updated to document new features like Validator Staking ADO, Asset enum, ADOBaseVersion query, Conditional Splitter, and various ADOs. Enhanced staking and auction features.
contracts/data-storage/andromeda-graph/src/contract.rs New smart contract implementation with functions for instantiation, execution, querying, and migration, including various execution and query functions for managing maps.
contracts/data-storage/andromeda-graph/src/testing/mock.rs New mock functions and types for testing, providing methods for initialization and interaction with the contract.
packages/andromeda-data-storage/src/graph.rs New data structures and message types for managing map-related functionalities, including InstantiateMsg, MapInfo, and various query and execution messages.

Possibly related PRs

Suggested labels

ci: skip-changelog

Suggested reviewers

Poem

In the garden of code, we hop and play,
New features sprout, brightening the day.
With mocks and tests, we dance with delight,
Building a world where data takes flight! 🐇✨
So let’s cheer for the changes, both big and small,
In the realm of Andromeda, we’re having a ball!


📜 Recent review details **Configuration used: CodeRabbit UI** **Review profile: CHILL**
📥 Commits Files that changed from the base of the PR and between 414ec59d0737fb1b129993e4e6ec509566a15873 and 03953be23a218beb562b35b2d5645dde53ad4614.
⛔ Files ignored due to path filters (1) * `Cargo.lock` is excluded by `!**/*.lock`
📒 Files selected for processing (1) * CHANGELOG.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1) * CHANGELOG.md
--- Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?
❤️ Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
🪧 Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit , please review it.` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (Invoked using PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. ### Other keywords and placeholders - Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. - Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description. - Add `@coderabbitai` anywhere in the PR title to generate the title automatically. ### CodeRabbit Configuration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.