module pyth::data_source { use sui::dynamic_field::{Self}; use sui::object::{UID}; use sui::tx_context::{TxContext}; use pyth::set::{Self}; use wormhole::external_address::ExternalAddress; const KEY: vector = b"data_sources"; const E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS: u64 = 0; const E_DATA_SOURCE_ALREADY_REGISTERED: u64 = 1; struct DataSource has copy, drop, store { emitter_chain: u64, emitter_address: ExternalAddress, } public fun new_data_source_registry(parent_id: &mut UID, ctx: &mut TxContext) { assert!( !dynamic_field::exists_(parent_id, KEY), E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS // TODO - add custom error type ); dynamic_field::add( parent_id, KEY, set::new(ctx) ) } public fun add(parent_id: &mut UID, data_source: DataSource) { assert!( !contains(parent_id, data_source), E_DATA_SOURCE_ALREADY_REGISTERED ); set::add( dynamic_field::borrow_mut(parent_id, KEY), data_source ) } public fun empty(parent_id: &mut UID){ set::empty( dynamic_field::borrow_mut(parent_id, KEY) ) } public fun contains(parent_id: &UID, data_source: DataSource): bool { let ref = dynamic_field::borrow(parent_id, KEY); set::contains(ref, data_source) } public fun new(emitter_chain: u64, emitter_address: ExternalAddress): DataSource { DataSource { emitter_chain: emitter_chain, emitter_address: emitter_address, } } }