data_source.move 2.1 KB

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