Skip to content

Commit

Permalink
[apps] Upgrade VerityMoveOracles to new version
Browse files Browse the repository at this point in the history
  • Loading branch information
jolestar committed Feb 6, 2025
1 parent 74f3fd3 commit 0c6b3e2
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 8 deletions.
5 changes: 2 additions & 3 deletions apps/twitter_binding/Move.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@ MoveStdlib = { local = "../../frameworks/move-stdlib" }
MoveosStdlib = { local = "../../frameworks/moveos-stdlib" }
RoochFramework = { local = "../../frameworks/rooch-framework" }
BitcoinMove = { local = "../../frameworks/bitcoin-move" }
verity-move-oracles = { git = "https://github.com/usherlabs/verity-move-oracles", subdir = "rooch", rev = "d08d06fe56ff2e6daae63555dc776454bb1e0405"}
VerityMoveOracles = { git = "https://github.com/usherlabs/verity-move-oracles", subdir = "rooch", rev = "5053cb6563eca20f2c1c38784e8b20e9e3bb617f"}
app_admin = { local = "../../apps/app_admin" }

[addresses]
twitter_binding = "_"
app_admin = "_"
verity = "0x9ce8eaf2166e9a6d4e8f1d27626297a0cf5ba1eaeb31137e08cc8f7773fb83f8"
verity_test_foreign_module = "0x9ce8eaf2166e9a6d4e8f1d27626297a0cf5ba1eaeb31137e08cc8f7773fb83f8"
verity = "0xf1290fb0e7e1de7e92e616209fb628970232e85c4c1a264858ff35092e1be231"
std = "0x1"
moveos_std = "0x2"
rooch_framework = "0x3"
Expand Down
Binary file added apps/twitter_binding/released/10/package.rpd
Binary file not shown.
31 changes: 26 additions & 5 deletions apps/twitter_binding/sources/tweet_fetcher.move
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module twitter_binding::tweet_fetcher {
use moveos_std::json;
use moveos_std::object::{Self, ObjectID, Object};
use moveos_std::event;
use moveos_std::tx_context;

use twitter_binding::twitter_account;
use twitter_binding::tweet_v2;
Expand All @@ -26,10 +27,15 @@ module twitter_binding::tweet_fetcher {

const MAX_BUFFER_QUEUE_SIZE: u64 = 20;

/// The minimum balance of the oracle escrow account 10 RGas
const MIN_ORACLE_ESCROW_BALANCE: u256 = 10_00000000;

const ErrorInvalidRequestID: u64 = 1;
const ErrorInvalidResponse: u64 = 2;
const ErrorTooManyPendingRequests: u64 = 3;
const ErrorDeprecatedFunction: u64 = 4;
/// The oracle escrow balance is not enough, please call `oracles::deposit_to_escrow` to deposit more RGas
const ErrorOracleEscrowBalanceNotEnough: u64 = 5;

struct BufferQueue has key {
// Buffered tweet ids
Expand Down Expand Up @@ -175,9 +181,8 @@ module twitter_binding::tweet_fetcher {
if (vector::contains(&buffer_queue.buffer_queue, &tweet_id)){
return TWEET_STATUS_IN_BUFFER_QUEUE
};
if (vector::length(&buffer_queue.buffer_queue) == MAX_BUFFER_QUEUE_SIZE){
process_buffer_queue();
};
assert!(vector::length(&buffer_queue.buffer_queue) < MAX_BUFFER_QUEUE_SIZE, ErrorTooManyPendingRequests);

vector::push_back(&mut buffer_queue.buffer_queue, tweet_id);
TWEET_STATUS_FETCHING
}
Expand All @@ -198,14 +203,30 @@ module twitter_binding::tweet_fetcher {
}

public entry fun process_buffer_queue(){
let sender = tx_context::sender();
assert!(check_oracle_escrow_balance(sender), ErrorInvalidResponse);
let buffer_queue = borrow_mut_buffer_queue();
if (vector::length(&buffer_queue.buffer_queue) == 0){
let buffer_queue_len = vector::length(&buffer_queue.buffer_queue);
if (buffer_queue_len == 0){
return
};
let tweet_ids = vector::trim_reverse(&mut buffer_queue.buffer_queue, 0);
let _batch_fetch_result = batch_fetch_tweets(tweet_ids);
}

public fun check_oracle_escrow_balance(addr: address): bool{
let balance = oracles::get_user_balance(addr);
balance >= MIN_ORACLE_ESCROW_BALANCE
}

public entry fun deposit_to_oracle_escrow(caller: &signer, amount: u256){
oracles::deposit_to_escrow(caller, amount);
}

public entry fun withdraw_from_oracle_escrow(caller: &signer, amount: u256){
oracles::withdraw_from_escrow(caller, amount);
}

public fun has_buffered_tweets(): bool{
let buffer_queue = borrow_buffer_queue();
vector::length(&buffer_queue.buffer_queue) > 0
Expand All @@ -222,7 +243,7 @@ module twitter_binding::tweet_fetcher {
//The jq query to parse the tweet
let pick = string::utf8(PICK);
let http_request = oracles::build_request(url, method, headers, body);
let request_id = oracles::new_request(http_request, pick, ORACLE_ADDRESS, oracles::with_notify(@twitter_binding, b"tweet_fetcher::check_request_queue"));
let request_id = oracles::new_request(http_request, pick, ORACLE_ADDRESS, oracles::with_notify(@twitter_binding, string::utf8(b"tweet_fetcher::check_request_queue")));
let fetch_result = BatchFetchResult{
tweet_ids,
request_id,
Expand Down
110 changes: 110 additions & 0 deletions scripts/twitter_fetcher_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/usr/bin/env python3

import argparse
import subprocess
import json
import time

ADDR = "0x701c21bf1c8cd5af8c42983890d8ca55e7a820171b8e744c13f2d9998bf76cc3"
COMMANDS = {
'check_balance': f"rooch move view --function {ADDR}::tweet_fetcher::check_oracle_escrow_balance --args address:default",
'deposit': f"rooch move run --function {ADDR}::tweet_fetcher::deposit_to_oracle_escrow --args u256:1000000000",
'fetch_tweet': f"rooch move run --function {ADDR}::tweet_fetcher::fetch_tweet_entry --args string:{{}}",
'process_queue': f"rooch move run --function {ADDR}::tweet_fetcher::process_buffer_queue --json",
'check_request': f"rooch move run --function {ADDR}::tweet_fetcher::check_request_queue",
'check_tweet': f"rooch move view --function {ADDR}::tweet_v2::exists_tweet_object --args string:{{}}"
}

def run_command(cmd):
result = subprocess.run(cmd.split(), capture_output=True, text=True)
if result.returncode != 0:
raise Exception(f"Command failed: {result.stderr}")
return result.stdout

def check_and_deposit():
# Check balance
output = run_command(COMMANDS['check_balance'])
response = json.loads(output)

if not response['return_values'][0]['decoded_value']:
print("Insufficient balance, depositing funds...")
run_command(COMMANDS['deposit'])
print("Funds deposited")

def get_request_id(process_output):
try:
data = json.loads(process_output)
for event in data['output']['events']:
if event['event_type'].endswith('::oracles::RequestAdded'):
return event['decoded_event_data']['value']['request_id']
except Exception as e:
print(f"Error parsing request_id: {e}")
return None

def check_request_status(request_id):
cmd = f"rooch object -i {request_id}"
output = run_command(cmd)
data = json.loads(output)
if 'data' in data and len(data['data']) > 0:
request = data['data'][0]
if 'decoded_value' in request:
return request['decoded_value']['value'].get('response_status', 0)
return 0

def check_request_status_with_timeout(request_id, timeout=60, interval=5):
start_time = time.time()
while time.time() - start_time < timeout:
status = check_request_status(request_id)
if status != 0:
return status
time.sleep(interval)
raise TimeoutError(f"Request {request_id} did not complete within {timeout} seconds")

def fetch_tweet(tweet_id):
check_and_deposit()

print(f"Fetching tweet {tweet_id}...")
run_command(COMMANDS['fetch_tweet'].format(tweet_id))

time.sleep(2)

print("Processing queue...")
process_output = run_command(COMMANDS['process_queue'])
request_id = get_request_id(process_output)

time.sleep(3)

if not request_id:
raise Exception("Failed to get request_id")

print(f"Request ID: {request_id}")
check_request_status_with_timeout(request_id)

print("Checking request queue...")
run_command(COMMANDS['check_request'])

timeout = 120
start_time = time.time()

while time.time() - start_time < timeout:
output = run_command(COMMANDS['check_tweet'].format(tweet_id))
if '"decoded_value": true' in output:
print("Tweet fetched successfully!")
return True
time.sleep(5)

raise TimeoutError(f"Tweet {tweet_id} not found after {timeout} seconds")

def main():
parser = argparse.ArgumentParser(description="Tweet fetcher test script")
parser.add_argument("tweet_id", help="Twitter ID to fetch")
args = parser.parse_args()

try:
fetch_tweet(args.tweet_id)
except Exception as e:
print(f"Error: {e}")
exit(1)

if __name__ == "__main__":
main()

0 comments on commit 0c6b3e2

Please sign in to comment.