Skip to content

Commit

Permalink
[framework] add oracle admin cap (#2558)
Browse files Browse the repository at this point in the history
Co-authored-by: mx819812523 <mx819812523@gamil.com>
  • Loading branch information
mx819812523 and mx819812523 committed Sep 2, 2024
1 parent a5fb397 commit fce626d
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 8 deletions.
Binary file modified frameworks/framework-release/released/8/0x3/package.rpd
Binary file not shown.
Binary file modified frameworks/framework-release/released/8/stdlib
Binary file not shown.
18 changes: 15 additions & 3 deletions frameworks/rooch-framework/doc/oracle.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

- [Resource `TablePlaceholder`](#0x3_oracle_TablePlaceholder)
- [Resource `SimpleOracle`](#0x3_oracle_SimpleOracle)
- [Resource `AdminCap`](#0x3_oracle_AdminCap)
- [Struct `StoredData`](#0x3_oracle_StoredData)
- [Constants](#@Constants_0)
- [Function `get_historical_data`](#0x3_oracle_get_historical_data)
Expand Down Expand Up @@ -49,6 +50,17 @@



<a name="0x3_oracle_AdminCap"></a>

## Resource `AdminCap`



<pre><code><b>struct</b> <a href="oracle.md#0x3_oracle_AdminCap">AdminCap</a> <b>has</b> store, key
</code></pre>



<a name="0x3_oracle_StoredData"></a>

## Struct `StoredData`
Expand Down Expand Up @@ -112,7 +124,7 @@
Create a new shared SimpleOracle object for publishing data.


<pre><code><b>public</b> entry <b>fun</b> <a href="oracle.md#0x3_oracle_create">create</a>(name: <a href="_String">string::String</a>, url: <a href="_String">string::String</a>, description: <a href="_String">string::String</a>)
<pre><code><b>public</b> <b>fun</b> <a href="oracle.md#0x3_oracle_create">create</a>(name: <a href="_String">string::String</a>, url: <a href="_String">string::String</a>, description: <a href="_String">string::String</a>): <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_AdminCap">oracle::AdminCap</a>&gt;
</code></pre>


Expand All @@ -123,7 +135,7 @@ Create a new shared SimpleOracle object for publishing data.



<pre><code><b>public</b> <b>fun</b> <a href="oracle.md#0x3_oracle_submit_data">submit_data</a>&lt;T: <b>copy</b>, drop, store&gt;(oracle_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_SimpleOracle">oracle::SimpleOracle</a>&gt;, ticker: <a href="_String">string::String</a>, value: T, identifier: <a href="_String">string::String</a>)
<pre><code><b>public</b> <b>fun</b> <a href="oracle.md#0x3_oracle_submit_data">submit_data</a>&lt;T: <b>copy</b>, drop, store&gt;(oracle_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_SimpleOracle">oracle::SimpleOracle</a>&gt;, ticker: <a href="_String">string::String</a>, value: T, identifier: <a href="_String">string::String</a>, admin_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_AdminCap">oracle::AdminCap</a>&gt;)
</code></pre>


Expand All @@ -134,5 +146,5 @@ Create a new shared SimpleOracle object for publishing data.



<pre><code><b>public</b> <b>fun</b> <a href="oracle.md#0x3_oracle_archive_data">archive_data</a>&lt;K: <b>copy</b>, drop, store, V: <b>copy</b>, drop, store&gt;(oracle_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_SimpleOracle">oracle::SimpleOracle</a>&gt;, ticker: <a href="_String">string::String</a>, archival_key: K)
<pre><code><b>public</b> <b>fun</b> <a href="oracle.md#0x3_oracle_archive_data">archive_data</a>&lt;K: <b>copy</b>, drop, store, V: <b>copy</b>, drop, store&gt;(oracle_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_SimpleOracle">oracle::SimpleOracle</a>&gt;, ticker: <a href="_String">string::String</a>, archival_key: K, admin_obj: &<b>mut</b> <a href="_Object">object::Object</a>&lt;<a href="oracle.md#0x3_oracle_AdminCap">oracle::AdminCap</a>&gt;)
</code></pre>
24 changes: 19 additions & 5 deletions frameworks/rooch-framework/sources/oracle/oracle.move
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module rooch_framework::oracle {
use moveos_std::timestamp::now_milliseconds;
use moveos_std::tx_context::sender;
use moveos_std::object;
use moveos_std::object::Object;
use moveos_std::object::{Object, ObjectID};
use moveos_std::table::Table;
use moveos_std::table;

Expand All @@ -34,6 +34,10 @@ module rooch_framework::oracle {
url: String,
}

struct AdminCap has key, store {
oracle_id: ObjectID
}

struct StoredData<T: store> has copy, store, drop {
value: T,
sequence_number: u64,
Expand Down Expand Up @@ -68,19 +72,26 @@ module rooch_framework::oracle {
}

/// Create a new shared SimpleOracle object for publishing data.
public entry fun create(name: String, url: String, description: String) {
public fun create(name: String, url: String, description: String): Object<AdminCap> {
let oracle = object::new(SimpleOracle { id: object::new(TablePlaceholder{_placeholder: false}), address: sender(), name, description, url });
object::to_shared(oracle)
let oracle_id = object::id(&oracle);
object::to_shared(oracle);
object::new(AdminCap{
oracle_id
})
}

public fun submit_data<T: store + copy + drop>(
oracle_obj: &mut Object<SimpleOracle>,
ticker: String,
value: T,
identifier: String,
admin_obj: &mut Object<AdminCap>,
) {
let oracle_id = object::id(oracle_obj);
let admin_id = object::borrow(admin_obj).oracle_id;
assert!(oracle_id == admin_id, ErrorSenderNotOracle);
let oracle = object::borrow_mut(oracle_obj);
assert!(oracle.address == sender(), ErrorSenderNotOracle);

let sequence_number = if (object::contains_field(&oracle.id, ticker)) {
let old_data: StoredData<T> = object::remove_field(&mut oracle.id, ticker);
Expand All @@ -102,9 +113,12 @@ module rooch_framework::oracle {
oracle_obj: &mut Object<SimpleOracle>,
ticker: String,
archival_key: K,
admin_obj: &mut Object<AdminCap>,
) {
let oracle_id = object::id(oracle_obj);
let admin_id = object::borrow(admin_obj).oracle_id;
assert!(oracle_id == admin_id, ErrorSenderNotOracle);
let oracle = object::borrow_mut(oracle_obj);
assert!(oracle.address == sender(), ErrorSenderNotOracle);
assert!(object::contains_field(&oracle.id, ticker), ErrorTickerNotExists);

let latest_data: StoredData<V> = *object::borrow_mut_field(&mut oracle.id, ticker);
Expand Down

0 comments on commit fce626d

Please sign in to comment.