data_source.move 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. module pyth::data_source {
  2. use sui::dynamic_field::{Self};
  3. use sui::object::{UID};
  4. use sui::tx_context::{TxContext};
  5. use pyth::set::{Self};
  6. use wormhole::external_address::ExternalAddress;
  7. const KEY: vector<u8> = b"data_sources";
  8. const E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS: u64 = 0;
  9. const E_DATA_SOURCE_ALREADY_REGISTERED: u64 = 1;
  10. struct DataSource has copy, drop, store {
  11. emitter_chain: u64,
  12. emitter_address: ExternalAddress,
  13. }
  14. public fun new_data_source_registry(parent_id: &mut UID, ctx: &mut TxContext) {
  15. assert!(
  16. !dynamic_field::exists_(parent_id, KEY),
  17. E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS // TODO - add custom error type
  18. );
  19. dynamic_field::add(
  20. parent_id,
  21. KEY,
  22. set::new<DataSource>(ctx)
  23. )
  24. }
  25. public fun add(parent_id: &mut UID, data_source: DataSource) {
  26. assert!(
  27. !contains(parent_id, data_source),
  28. E_DATA_SOURCE_ALREADY_REGISTERED
  29. );
  30. set::add(
  31. dynamic_field::borrow_mut(parent_id, KEY),
  32. data_source
  33. )
  34. }
  35. public fun empty(parent_id: &mut UID){
  36. set::empty<DataSource>(
  37. dynamic_field::borrow_mut(parent_id, KEY)
  38. )
  39. }
  40. public fun contains(parent_id: &UID, data_source: DataSource): bool {
  41. let ref = dynamic_field::borrow(parent_id, KEY);
  42. set::contains<DataSource>(ref, data_source)
  43. }
  44. public fun new(emitter_chain: u64, emitter_address: ExternalAddress): DataSource {
  45. DataSource {
  46. emitter_chain: emitter_chain,
  47. emitter_address: emitter_address,
  48. }
  49. }
  50. }