data_source.move 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. friend pyth::state;
  8. friend pyth::set_data_sources;
  9. friend pyth::pyth;
  10. friend pyth::set_governance_data_source;
  11. #[test_only]
  12. friend pyth::pyth_tests;
  13. #[test_only]
  14. friend pyth::set_data_sources_tests;
  15. const KEY: vector<u8> = b"data_sources";
  16. const E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS: u64 = 0;
  17. const E_DATA_SOURCE_ALREADY_REGISTERED: u64 = 1;
  18. struct DataSource has copy, drop, store {
  19. emitter_chain: u64,
  20. emitter_address: ExternalAddress,
  21. }
  22. public(friend) fun new_data_source_registry(parent_id: &mut UID, ctx: &mut TxContext) {
  23. assert!(
  24. !dynamic_field::exists_(parent_id, KEY),
  25. E_DATA_SOURCE_REGISTRY_ALREADY_EXISTS // TODO - add custom error type
  26. );
  27. dynamic_field::add(
  28. parent_id,
  29. KEY,
  30. set::new<DataSource>(ctx)
  31. )
  32. }
  33. public(friend) fun add(parent_id: &mut UID, data_source: DataSource) {
  34. assert!(
  35. !contains(parent_id, data_source),
  36. E_DATA_SOURCE_ALREADY_REGISTERED
  37. );
  38. set::add(
  39. dynamic_field::borrow_mut(parent_id, KEY),
  40. data_source
  41. )
  42. }
  43. public(friend) fun empty(parent_id: &mut UID){
  44. set::empty<DataSource>(
  45. dynamic_field::borrow_mut(parent_id, KEY)
  46. )
  47. }
  48. public fun contains(parent_id: &UID, data_source: DataSource): bool {
  49. let ref = dynamic_field::borrow(parent_id, KEY);
  50. set::contains<DataSource>(ref, data_source)
  51. }
  52. public(friend) fun new(emitter_chain: u64, emitter_address: ExternalAddress): DataSource {
  53. DataSource {
  54. emitter_chain,
  55. emitter_address,
  56. }
  57. }
  58. public fun emitter_chain(data_source: &DataSource): u64{
  59. data_source.emitter_chain
  60. }
  61. public fun emitter_address(data_source: &DataSource): ExternalAddress{
  62. data_source.emitter_address
  63. }
  64. }