From fce626d001fe07d4fe84b15dfecc4c54bec6fa03 Mon Sep 17 00:00:00 2001 From: mx <53249469+mx819812523@users.noreply.github.com> Date: Mon, 2 Sep 2024 19:47:38 +0800 Subject: [PATCH] [framework] add oracle admin cap (#2558) Co-authored-by: mx819812523 --- .../released/8/0x3/package.rpd | Bin 40197 -> 40337 bytes .../framework-release/released/8/stdlib | Bin 160044 -> 160184 bytes frameworks/rooch-framework/doc/oracle.md | 18 ++++++++++--- .../sources/oracle/oracle.move | 24 ++++++++++++++---- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/frameworks/framework-release/released/8/0x3/package.rpd b/frameworks/framework-release/released/8/0x3/package.rpd index 91cfe30710733a0b586d3a21cd9b138674ad226b..4be47305a44851a955bbedd4706ccba082b8a738 100644 GIT binary patch delta 1381 zcmZWpy>A>v6o2o{%+AM~-MhV8-`SUob572=ICjoS6e*h^3PgmICN%WMi7gRCV&oVo zj|M>nLZ+dlphQA|gak-b6!{-0=qV6V8am$W`RpQlw=?tJypP}ez1jKX7y9y7`u>HT zJuki){>>QxCzYKJF1wl{n99gZdoX51GH&(kM z>Z=z*%sAybNk~Z5<`tv~#5~Ut8S}13S68DX6x`*JQkoGO8O(HTQQUkDE`@ZCJ$YafFMGC}%aT?8h$)(fMgYuY zm4eOE?17xXY4UmS(omJ;#+{N?qqLqdkd#0+L0{y5UeWUoTD{~B$GK*N-&eW3A!^%iMpXlEE8FYBMnB@>`wk z;lbhI!AD^}?L7J5==e{5P-f5epYH7+`lExLXYcGD?(ZGH5`UZFl8{cOpK4OeX2qF- zGv|ag(nAmDl~Jow1mOjw5sl>w0RJGsw1&v6rZu*qiWxI!Yr18+EKPz5LrpP+(8hqZ z(nB-ifEFhqw30?w(OW7*)VZDoEO}u$(sybT?c9uQov}DD);7A}0!1@rQ#*Y>3AINS zzS!5&YC(0e>pQCEvcp0kV+ZRPRiOl@W>x2`J5U!yVmVnAe64622s4$d27+n8wwda( zx+_l6N?Fn?wrtu|v93FHm(qnW9X0+csCj)OowLHaq7%hZbr++6mBey3*sx0eRQKvW zY4N{)d(K~AJ*{Ua1csLh^ueDHI0?QXZaKQb-G(ZYD9zK0#%!c3v3a6lBV8fpa=_{i fMmfWYKVfnuU4L=`%5fUQfBx(y{qgtWjnDrFs55Ug delta 1214 zcmY*Zy>A>v6o2o{$D6OcyS>|6pB=|{PHbOdJC2YdWr$ED8YCJT=<}giq5(@z5am^f z0x42-Z5k?CBsvHM5;cDW6e-doM3EwI);=fMyPcW$+u!^8?d&}JjlTPpe*TvizgItQ zzKRwADue+I4%J6Lq5cPt%rkmP{J;KFxfkxfeeQR|AAT>s^g6xrKd9=zWP7g@0U#og zB29)YFt`NZ88tv~pkhKmN(|U%1mJ;^QD4?17D5FJBxdN5ptTazz|dGUFk(bjTOp#e zQ%s;{y*@cs+x1X6)^ugm09_p;=p9@m)@pYh%LBc)(HB$CFKw3T+GUBa)y{N=PFFA67ja^~z&fZ)KI-FjY@dnDMj_MnQVQ%6P7|)d(#5PUbq-uL@za4B1 zeC>yRG-=xLW_xXIJ~|jr+xg@m9Vm_p9XRa)l+)#>>;;6;V6^Cw3brV`6$JXNr_;6s zh)gn|(E081%yuA21Xk!}lG~6Yr@OEoyu21w?2b%lGy&NY214O+DQvL{k6n0w?sJi~ z>!n2VB!LSoOOSA@rBo)Il_d!rm3q3WOvzwn7bq;f3T(TZWG+k5<+c)1r-%3yRf-lK zR(=;9fKjE9P6}WL%fG{?%UkjL#P(nf@TFWWu7OMU!=uRm5zP4K`5H zM^R_1KQ2aQ5hGIMENaT9gwYQv``Shj6o-&Qj#4SW_Lfwbl6fzs>1wMY)i``guU*Q{10*{wk=merCE7d2&tXz_7W4iIPdOkD`tys^U+1lpE6Ge|WP~ zhy%Z)5O)gkxkA&xoibxNFzoHS&{*;7t~P12U5=jak`y{Q>Ce^cQGJNXL~)d~Cbv}H OhMY6gU+(rlfBFV@_*mxv diff --git a/frameworks/framework-release/released/8/stdlib b/frameworks/framework-release/released/8/stdlib index 2d9258cb61cd4b89f304b9649d9f60eb6213a90b..3ddf9ca80c42ec9a1ed21a5c28ee4e4e0de494d4 100644 GIT binary patch delta 1369 zcmZWpy^mW(5TDtPw;!|5e$Rfk?;PL7m-ymb?&3?LNZF)8h%`q*nn+Y|TymBOB01z7 zqI9}YL4&X;Dd?b!6bf33l>7$>N-888I%c2GNx`$dJ2N{UzxmDc{`iOc`A_%k1>Os9 zy=r_v_=_?C$Po%r+?02JLiIP^)IW%?rFo%$m-ZX?QTC79_TTwE`qiuO%Dg7-$L!&{A3$4eiXJhRPxu z*(1&%x2S_eAGkrI-|QFt@?z=RzRWXU4Lb9Fci7uo+pYGyqu%cNe!i~^DYR&{gIZz&tWFKAoEo}~j zWi)j?2M&>`W4(?ROD8rOC(sM-K$wJkRS)aZ?kwaC#+>z4pc9-p*&P?-bSsguvd>E6 zc9#q=RGCmMvFVzl%%YSGS@16*w_3`YI;M#|6IqEP2g>T&cjI*fU?j7{#MF#{Nn|Xr zi3iTUef;>*lXs3jTfE!E=WTZ~J9_x(^zhNKz4zdg>BG~5yNlnNc)yiBIGN2(zVOTK z@bTxTiw~?AF5WM2Qf5!5PmZTEcY1R8^y8!1^my@YfxpbL!;}l%OD)MYy>4~i>T^t* zPy+`WQp-*5LEw25Lown%0J!%&OdZcpD-bwdg{RB;#ry_{TKFQk{_?=Ds dF_Y^8cyx#YA>v6o2o{o3EYOyWP9J_1STJ=fw8KA8|y*5Ro7nBpPU_NkFkg1D2d1%1f6b zQleC+NHkP5lt`pV3MBp#QlyAPi6|&|v*$CgA8%%U`+Hx%o!u9&{ZGI9hd<+|@q<_8 z51Vg;0e}*rqUuP!|0D8iJl4Ql420Jrb~10%{m&gBpew(W;&hyWd%mOKHiCoBksXmeq!@Ysd-=PnmnrI#GvqbCWR zVVQzNTTP`h;jC5?-;ogRV&|rF1|z#bVeVCGG~G=y=BenSgwx3ZOHr~G9#(D_4S-g; zk4_4(4i>li`0?UtA0I9DEBtIwe0h3ycKY3&ufKg@?w@>f@8oRpw8Bqn|KRk_{ja__ zJGp0;jKv=nzMShu%5gN(t>ZPvW2u37-NS~`>XL{;xQTL2WQ&6PC_sYf3Rgi>n{6(1 zFF3R?69fxP$c-Ln1O@45gqmnA)jq0H6<8N5;*{S>D(Yh1(SlAKWEL>#XbMwM2ql)9^}43v7!O^6(AG$BW{ zLC>WVNz_jj< + +## Resource `AdminCap` + + + +
struct AdminCap has store, key
+
+ + + ## Struct `StoredData` @@ -112,7 +124,7 @@ Create a new shared SimpleOracle object for publishing data. -
public entry fun create(name: string::String, url: string::String, description: string::String)
+
public fun create(name: string::String, url: string::String, description: string::String): object::Object<oracle::AdminCap>
 
@@ -123,7 +135,7 @@ Create a new shared SimpleOracle object for publishing data. -
public fun submit_data<T: copy, drop, store>(oracle_obj: &mut object::Object<oracle::SimpleOracle>, ticker: string::String, value: T, identifier: string::String)
+
public fun submit_data<T: copy, drop, store>(oracle_obj: &mut object::Object<oracle::SimpleOracle>, ticker: string::String, value: T, identifier: string::String, admin_obj: &mut object::Object<oracle::AdminCap>)
 
@@ -134,5 +146,5 @@ Create a new shared SimpleOracle object for publishing data. -
public fun archive_data<K: copy, drop, store, V: copy, drop, store>(oracle_obj: &mut object::Object<oracle::SimpleOracle>, ticker: string::String, archival_key: K)
+
public fun archive_data<K: copy, drop, store, V: copy, drop, store>(oracle_obj: &mut object::Object<oracle::SimpleOracle>, ticker: string::String, archival_key: K, admin_obj: &mut object::Object<oracle::AdminCap>)
 
diff --git a/frameworks/rooch-framework/sources/oracle/oracle.move b/frameworks/rooch-framework/sources/oracle/oracle.move index a69fe56d3..1739047be 100644 --- a/frameworks/rooch-framework/sources/oracle/oracle.move +++ b/frameworks/rooch-framework/sources/oracle/oracle.move @@ -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; @@ -34,6 +34,10 @@ module rooch_framework::oracle { url: String, } + struct AdminCap has key, store { + oracle_id: ObjectID + } + struct StoredData has copy, store, drop { value: T, sequence_number: u64, @@ -68,9 +72,13 @@ 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 { 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( @@ -78,9 +86,12 @@ module rooch_framework::oracle { ticker: String, value: T, identifier: String, + admin_obj: &mut Object, ) { + 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 = object::remove_field(&mut oracle.id, ticker); @@ -102,9 +113,12 @@ module rooch_framework::oracle { oracle_obj: &mut Object, ticker: String, archival_key: K, + admin_obj: &mut Object, ) { + 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 = *object::borrow_mut_field(&mut oracle.id, ticker);