data_source.move 2.4 KB

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