@audius/sdk 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/.eslintrc +38 -0
  2. package/.prettierrc.js +1 -0
  3. package/.python-version +1 -0
  4. package/Dockerfile +15 -0
  5. package/README.md +3 -0
  6. package/babel.config.js +3 -0
  7. package/data-contracts/ABIs/AdminUpgradeabilityProxy.json +132 -0
  8. package/data-contracts/ABIs/BaseAdminUpgradeabilityProxy.json +113 -0
  9. package/data-contracts/ABIs/BaseUpgradeabilityProxy.json +22 -0
  10. package/data-contracts/ABIs/DiscoveryProviderFactory.json +189 -0
  11. package/data-contracts/ABIs/DiscoveryProviderFactoryInterface.json +61 -0
  12. package/data-contracts/ABIs/DiscoveryProviderStorage.json +205 -0
  13. package/data-contracts/ABIs/DiscoveryProviderStorageInterface.json +65 -0
  14. package/data-contracts/ABIs/ECDSA.json +4 -0
  15. package/data-contracts/ABIs/IPLDBlacklistFactory.json +168 -0
  16. package/data-contracts/ABIs/Initializable.json +4 -0
  17. package/data-contracts/ABIs/Migrations.json +67 -0
  18. package/data-contracts/ABIs/OpenZeppelinUpgradesAddress.json +4 -0
  19. package/data-contracts/ABIs/Ownable.json +79 -0
  20. package/data-contracts/ABIs/PlaylistFactory.json +669 -0
  21. package/data-contracts/ABIs/PlaylistFactoryInterface.json +42 -0
  22. package/data-contracts/ABIs/PlaylistStorage.json +250 -0
  23. package/data-contracts/ABIs/PlaylistStorageInterface.json +129 -0
  24. package/data-contracts/ABIs/Proxy.json +10 -0
  25. package/data-contracts/ABIs/Registry.json +240 -0
  26. package/data-contracts/ABIs/RegistryContract.json +102 -0
  27. package/data-contracts/ABIs/RegistryContractInterface.json +28 -0
  28. package/data-contracts/ABIs/RegistryInterface.json +66 -0
  29. package/data-contracts/ABIs/SigningLogic.json +43 -0
  30. package/data-contracts/ABIs/SigningLogicInitializable.json +46 -0
  31. package/data-contracts/ABIs/SocialFeatureFactory.json +460 -0
  32. package/data-contracts/ABIs/SocialFeatureStorage.json +225 -0
  33. package/data-contracts/ABIs/SocialFeatureStorageInterface.json +123 -0
  34. package/data-contracts/ABIs/TestContract.json +135 -0
  35. package/data-contracts/ABIs/TestContractInterface.json +19 -0
  36. package/data-contracts/ABIs/TestContractWithStorage.json +165 -0
  37. package/data-contracts/ABIs/TestContractWithStorageInterface.json +24 -0
  38. package/data-contracts/ABIs/TestStorage.json +144 -0
  39. package/data-contracts/ABIs/TestStorageInterface.json +42 -0
  40. package/data-contracts/ABIs/TestUserReplicaSetManager.json +432 -0
  41. package/data-contracts/ABIs/TrackFactory.json +391 -0
  42. package/data-contracts/ABIs/TrackFactoryInterface.json +73 -0
  43. package/data-contracts/ABIs/TrackStorage.json +223 -0
  44. package/data-contracts/ABIs/TrackStorageInterface.json +121 -0
  45. package/data-contracts/ABIs/UpgradeabilityProxy.json +37 -0
  46. package/data-contracts/ABIs/UserFactory.json +657 -0
  47. package/data-contracts/ABIs/UserFactoryInterface.json +65 -0
  48. package/data-contracts/ABIs/UserLibraryFactory.json +334 -0
  49. package/data-contracts/ABIs/UserReplicaSetManager.json +418 -0
  50. package/data-contracts/ABIs/UserStorage.json +233 -0
  51. package/data-contracts/ABIs/UserStorageInterface.json +93 -0
  52. package/data-contracts/signatureSchemas.ts +1236 -0
  53. package/dist/core.d.ts +446 -0
  54. package/dist/core.js +769 -0
  55. package/dist/core.js.map +1 -0
  56. package/dist/index.d.ts +689 -0
  57. package/dist/index.js +72850 -0
  58. package/dist/index.js.map +1 -0
  59. package/eth-contracts/ABIs/Address.json +4 -0
  60. package/eth-contracts/ABIs/AudiusAdminUpgradeabilityProxy.json +105 -0
  61. package/eth-contracts/ABIs/AudiusClaimDistributor.json +4968 -0
  62. package/eth-contracts/ABIs/AudiusToken.json +724 -0
  63. package/eth-contracts/ABIs/BaseUpgradeabilityProxy.json +23 -0
  64. package/eth-contracts/ABIs/Checkpointing.json +4 -0
  65. package/eth-contracts/ABIs/ClaimsManager.json +539 -0
  66. package/eth-contracts/ABIs/Context.json +11 -0
  67. package/eth-contracts/ABIs/DelegateManager.json +989 -0
  68. package/eth-contracts/ABIs/DelegateManagerV2.json +1049 -0
  69. package/eth-contracts/ABIs/DelegateManagerV2Bad.json +1049 -0
  70. package/eth-contracts/ABIs/ERC20.json +252 -0
  71. package/eth-contracts/ABIs/ERC20Burnable.json +287 -0
  72. package/eth-contracts/ABIs/ERC20Detailed.json +270 -0
  73. package/eth-contracts/ABIs/ERC20Mintable.json +364 -0
  74. package/eth-contracts/ABIs/ERC20Pausable.json +397 -0
  75. package/eth-contracts/ABIs/EthRewardsManager.json +174 -0
  76. package/eth-contracts/ABIs/Governance.json +938 -0
  77. package/eth-contracts/ABIs/GovernanceUpgraded.json +953 -0
  78. package/eth-contracts/ABIs/GovernanceV2.json +938 -0
  79. package/eth-contracts/ABIs/IERC20.json +200 -0
  80. package/eth-contracts/ABIs/Initializable.json +4 -0
  81. package/eth-contracts/ABIs/InitializableV2.json +14 -0
  82. package/eth-contracts/ABIs/Migrations.json +71 -0
  83. package/eth-contracts/ABIs/MinterRole.json +91 -0
  84. package/eth-contracts/ABIs/MockAccount.json +62 -0
  85. package/eth-contracts/ABIs/MockDelegateManager.json +55 -0
  86. package/eth-contracts/ABIs/MockStakingCaller.json +259 -0
  87. package/eth-contracts/ABIs/MockWormhole.json +106 -0
  88. package/eth-contracts/ABIs/OpenZeppelinUpgradesAddress.json +4 -0
  89. package/eth-contracts/ABIs/Ownable.json +93 -0
  90. package/eth-contracts/ABIs/Pausable.json +150 -0
  91. package/eth-contracts/ABIs/PauserRole.json +91 -0
  92. package/eth-contracts/ABIs/Proxy.json +10 -0
  93. package/eth-contracts/ABIs/Registry.json +288 -0
  94. package/eth-contracts/ABIs/Roles.json +4 -0
  95. package/eth-contracts/ABIs/SafeERC20.json +4 -0
  96. package/eth-contracts/ABIs/SafeMath.json +4 -0
  97. package/eth-contracts/ABIs/ServiceProviderFactory.json +1153 -0
  98. package/eth-contracts/ABIs/ServiceTypeManager.json +337 -0
  99. package/eth-contracts/ABIs/Staking.json +555 -0
  100. package/eth-contracts/ABIs/StakingUpgraded.json +570 -0
  101. package/eth-contracts/ABIs/TestContract.json +44 -0
  102. package/eth-contracts/ABIs/TrustedNotifierManager.json +265 -0
  103. package/eth-contracts/ABIs/Uint256Helpers.json +4 -0
  104. package/eth-contracts/ABIs/UpgradeabilityProxy.json +40 -0
  105. package/eth-contracts/ABIs/Wormhole.json +45 -0
  106. package/eth-contracts/ABIs/WormholeClient.json +155 -0
  107. package/examples/file.mp3 +0 -0
  108. package/examples/initAudiusLibs.js +86 -0
  109. package/examples/initializeVersions.js +95 -0
  110. package/examples/pic.jpg +0 -0
  111. package/initScripts/configureLocalDiscProv.js +167 -0
  112. package/initScripts/helpers/claim.js +43 -0
  113. package/initScripts/helpers/distributeTokens.js +24 -0
  114. package/initScripts/helpers/spRegistration.js +138 -0
  115. package/initScripts/helpers/utils.js +34 -0
  116. package/initScripts/helpers/version.js +93 -0
  117. package/initScripts/local.js +617 -0
  118. package/initScripts/mainnet.js +131 -0
  119. package/initScripts/manageProdRelayerWallets.js +191 -0
  120. package/package.json +125 -0
  121. package/rollup.config.js +164 -0
  122. package/scripts/AudiusClaimDistributor.json +4968 -0
  123. package/scripts/Wormhole.json +155 -0
  124. package/scripts/addCIDToIpldBlacklist.js +124 -0
  125. package/scripts/circleci-test.sh +53 -0
  126. package/scripts/communityRewards/transferCommunityRewardsToSolana.js +222 -0
  127. package/scripts/ipfs.sh +58 -0
  128. package/scripts/migrate_contracts.sh +25 -0
  129. package/scripts/reset.sh +65 -0
  130. package/scripts/test.sh +77 -0
  131. package/src/api/account.js +670 -0
  132. package/src/api/base.js +122 -0
  133. package/src/api/file.js +168 -0
  134. package/src/api/playlist.js +328 -0
  135. package/src/api/rewards.d.ts +4 -0
  136. package/src/api/rewards.js +682 -0
  137. package/src/api/serviceProvider.js +154 -0
  138. package/src/api/track.js +604 -0
  139. package/src/api/user.js +888 -0
  140. package/src/api/user.test.js +172 -0
  141. package/src/constants.ts +7 -0
  142. package/src/core.ts +3 -0
  143. package/src/index.js +6 -0
  144. package/src/libs.d.ts +3 -0
  145. package/src/libs.js +619 -0
  146. package/src/sanityChecks/addSecondaries.js +40 -0
  147. package/src/sanityChecks/assignReplicaSetIfNecessary.js +10 -0
  148. package/src/sanityChecks/index.d.ts +9 -0
  149. package/src/sanityChecks/index.js +31 -0
  150. package/src/sanityChecks/isCreator.js +73 -0
  151. package/src/sanityChecks/needsRecoveryEmail.js +20 -0
  152. package/src/sanityChecks/rolloverNodes.js +74 -0
  153. package/src/sanityChecks/sanitizeNodes.js +24 -0
  154. package/src/sanityChecks/syncNodes.js +28 -0
  155. package/src/sdk/constants.ts +10 -0
  156. package/src/sdk/index.ts +1 -0
  157. package/src/sdk/oauth/Oauth.ts +265 -0
  158. package/src/sdk/oauth/index.ts +1 -0
  159. package/src/sdk/sdk.ts +102 -0
  160. package/src/service-selection/ServiceSelection.test.ts +320 -0
  161. package/src/service-selection/ServiceSelection.ts +460 -0
  162. package/src/service-selection/constants.ts +14 -0
  163. package/src/service-selection/index.ts +1 -0
  164. package/src/services/ABIDecoder/AudiusABIDecoder.ts +71 -0
  165. package/src/services/ABIDecoder/index.ts +1 -0
  166. package/src/services/comstock/Comstock.ts +39 -0
  167. package/src/services/comstock/index.ts +1 -0
  168. package/src/services/contracts/ContractClient.ts +227 -0
  169. package/src/services/contracts/GovernedContractClient.ts +53 -0
  170. package/src/services/contracts/ProviderSelection.ts +42 -0
  171. package/src/services/creatorNode/CreatorNode.ts +1065 -0
  172. package/src/services/creatorNode/CreatorNodeSelection.test.ts +997 -0
  173. package/src/services/creatorNode/CreatorNodeSelection.ts +488 -0
  174. package/src/services/creatorNode/constants.ts +10 -0
  175. package/src/services/creatorNode/index.ts +2 -0
  176. package/src/services/dataContracts/AudiusContracts.ts +234 -0
  177. package/src/services/dataContracts/IPLDBlacklistFactoryClient.ts +73 -0
  178. package/src/services/dataContracts/PlaylistFactoryClient.ts +370 -0
  179. package/src/services/dataContracts/RegistryClient.ts +95 -0
  180. package/src/services/dataContracts/SocialFeatureFactoryClient.ts +196 -0
  181. package/src/services/dataContracts/TrackFactoryClient.ts +131 -0
  182. package/src/services/dataContracts/UserFactoryClient.ts +351 -0
  183. package/src/services/dataContracts/UserLibraryFactoryClient.ts +115 -0
  184. package/src/services/dataContracts/UserReplicaSetManagerClient.ts +206 -0
  185. package/src/services/dataContracts/index.ts +1 -0
  186. package/src/services/discoveryProvider/DiscoveryProvider.ts +1168 -0
  187. package/src/services/discoveryProvider/DiscoveryProviderSelection.test.ts +536 -0
  188. package/src/services/discoveryProvider/DiscoveryProviderSelection.ts +383 -0
  189. package/src/services/discoveryProvider/constants.ts +13 -0
  190. package/src/services/discoveryProvider/index.ts +1 -0
  191. package/src/services/discoveryProvider/requests.ts +629 -0
  192. package/src/services/ethContracts/AudiusTokenClient.ts +163 -0
  193. package/src/services/ethContracts/ClaimDistributionClient.ts +45 -0
  194. package/src/services/ethContracts/ClaimsManagerClient.ts +102 -0
  195. package/src/services/ethContracts/DelegateManagerClient.ts +480 -0
  196. package/src/services/ethContracts/EthContracts.ts +359 -0
  197. package/src/services/ethContracts/EthRewardsManagerClient.ts +33 -0
  198. package/src/services/ethContracts/GovernanceClient.ts +451 -0
  199. package/src/services/ethContracts/RegistryClient.ts +33 -0
  200. package/src/services/ethContracts/ServiceProviderFactoryClient.ts +691 -0
  201. package/src/services/ethContracts/ServiceTypeManagerClient.ts +112 -0
  202. package/src/services/ethContracts/StakingProxyClient.ts +97 -0
  203. package/src/services/ethContracts/TrustedNotifierManagerClient.ts +101 -0
  204. package/src/services/ethContracts/WormholeClient.ts +97 -0
  205. package/src/services/ethContracts/index.ts +1 -0
  206. package/src/services/ethWeb3Manager/EthWeb3Manager.ts +239 -0
  207. package/src/services/ethWeb3Manager/index.ts +1 -0
  208. package/src/services/hedgehog/Hedgehog.ts +96 -0
  209. package/src/services/hedgehog/index.ts +1 -0
  210. package/src/services/identity/IdentityService.ts +551 -0
  211. package/src/services/identity/index.ts +1 -0
  212. package/src/services/identity/requests.ts +65 -0
  213. package/src/services/schemaValidator/SchemaValidator.ts +105 -0
  214. package/src/services/schemaValidator/index.ts +1 -0
  215. package/src/services/schemaValidator/schemas/trackSchema.json +267 -0
  216. package/src/services/schemaValidator/schemas/userSchema.json +230 -0
  217. package/src/services/solanaAudiusData/errors.ts +20 -0
  218. package/src/services/solanaAudiusData/index.ts +1189 -0
  219. package/src/services/solanaWeb3Manager/errors.js +101 -0
  220. package/src/services/solanaWeb3Manager/index.d.ts +46 -0
  221. package/src/services/solanaWeb3Manager/index.js +655 -0
  222. package/src/services/solanaWeb3Manager/padBNToUint8Array.ts +7 -0
  223. package/src/services/solanaWeb3Manager/rewards.js +941 -0
  224. package/src/services/solanaWeb3Manager/rewardsAttester.ts +1093 -0
  225. package/src/services/solanaWeb3Manager/tokenAccount.js +149 -0
  226. package/src/services/solanaWeb3Manager/transactionHandler.js +345 -0
  227. package/src/services/solanaWeb3Manager/transfer.js +272 -0
  228. package/src/services/solanaWeb3Manager/userBank.js +160 -0
  229. package/src/services/solanaWeb3Manager/utils.d.ts +31 -0
  230. package/src/services/solanaWeb3Manager/utils.js +163 -0
  231. package/src/services/solanaWeb3Manager/wAudio.js +28 -0
  232. package/src/services/solanaWeb3Manager/wAudio.test.js +30 -0
  233. package/src/services/web3Manager/Web3Config.ts +14 -0
  234. package/src/services/web3Manager/Web3Manager.ts +360 -0
  235. package/src/services/web3Manager/XMLHttpRequest.ts +11 -0
  236. package/src/services/web3Manager/index.ts +2 -0
  237. package/src/services/wormhole/index.js +424 -0
  238. package/src/types.ts +8 -0
  239. package/src/userStateManager.ts +53 -0
  240. package/src/utils/apiSigning.ts +51 -0
  241. package/src/utils/captcha.ts +97 -0
  242. package/src/utils/estimateGas.ts +64 -0
  243. package/src/utils/fileHasher.ts +278 -0
  244. package/src/utils/importContractABI.d.ts +9 -0
  245. package/src/utils/importContractABI.js +19 -0
  246. package/src/utils/index.ts +11 -0
  247. package/src/utils/multiProvider.ts +72 -0
  248. package/src/utils/network.test.ts +127 -0
  249. package/src/utils/network.ts +308 -0
  250. package/src/utils/promiseFight.test.ts +87 -0
  251. package/src/utils/promiseFight.ts +36 -0
  252. package/src/utils/signatures.ts +139 -0
  253. package/src/utils/types.ts +34 -0
  254. package/src/utils/utils.test.ts +36 -0
  255. package/src/utils/utils.ts +235 -0
  256. package/src/utils/uuid.ts +14 -0
  257. package/src/web3.d.ts +9 -0
  258. package/src/web3.js +8 -0
  259. package/tests/assets/static_image.png +0 -0
  260. package/tests/assets/static_text.txt +1 -0
  261. package/tests/audiusTokenClientTest.js +37 -0
  262. package/tests/creatorNodeTest.js +19 -0
  263. package/tests/fileHasherTest.js +125 -0
  264. package/tests/governanceTest.js +382 -0
  265. package/tests/helpers.js +105 -0
  266. package/tests/index.js +14 -0
  267. package/tests/playlistClientTest.js +157 -0
  268. package/tests/providerSelectionTest.js +241 -0
  269. package/tests/registryClientTest.js +19 -0
  270. package/tests/rewardsAttesterTest.js +373 -0
  271. package/tests/serviceTypeManagerClientTest.js +33 -0
  272. package/tests/socialFeatureClientTest.js +79 -0
  273. package/tests/stakingTest.js +302 -0
  274. package/tests/trackClientTest.js +86 -0
  275. package/tests/userClientTest.js +121 -0
  276. package/tsconfig.json +10 -0
  277. package/types/@audius-hedgehog/index.d.ts +39 -0
  278. package/types/abi-decoder/index.d.ts +41 -0
@@ -0,0 +1,227 @@
1
+ import { ProviderSelection } from './ProviderSelection'
2
+ import { Web3Manager } from '../web3Manager'
3
+ import retry from 'async-retry'
4
+ import type { ContractABI, Nullable, Logger } from '../../utils'
5
+ import type { Contract } from 'web3-eth-contract'
6
+ import type { HttpProvider } from 'web3-core'
7
+ import type { EthWeb3Manager } from '../ethWeb3Manager'
8
+
9
+ const CONTRACT_INITIALIZING_INTERVAL = 100
10
+ const CONTRACT_INITIALIZING_TIMEOUT = 10000
11
+ const CONTRACT_INIT_MAX_ATTEMPTS = 5
12
+ const METHOD_CALL_MAX_RETRIES = 5
13
+
14
+ export type GetRegistryAddress = (key: string) => Promise<string>
15
+
16
+ /*
17
+ * Base class for instantiating contracts.
18
+ * Performs a single init of the eth contract the first
19
+ * time a method on the contract is invoked.
20
+ */
21
+ export class ContractClient {
22
+ web3Manager: Web3Manager | EthWeb3Manager
23
+ contractABI: ContractABI['abi']
24
+ contractRegistryKey: string
25
+ getRegistryAddress: GetRegistryAddress
26
+ _contractAddress: Nullable<string>
27
+ _contract: Nullable<Contract>
28
+ _isInitialized: boolean
29
+ _isInitializing: boolean
30
+ _initAttempts: number
31
+ providerSelector: Nullable<ProviderSelection>
32
+ logger: Logger
33
+
34
+ constructor(
35
+ web3Manager: Web3Manager | EthWeb3Manager,
36
+ contractABI: ContractABI['abi'],
37
+ contractRegistryKey: string,
38
+ getRegistryAddress: GetRegistryAddress,
39
+ logger: Logger = console,
40
+ contractAddress: Nullable<string> = null
41
+ ) {
42
+ this.web3Manager = web3Manager
43
+ this.contractABI = contractABI
44
+ this.contractRegistryKey = contractRegistryKey
45
+ this.getRegistryAddress = getRegistryAddress
46
+ this.logger = logger
47
+
48
+ // Once initialized, contract address and contract are set up
49
+ this._contractAddress = contractAddress
50
+ this._contract = null
51
+
52
+ // Initialization setup
53
+ this._isInitialized = false
54
+ this._isInitializing = false
55
+ this._initAttempts = 0
56
+
57
+ // Initializing this.providerSelector for POA provider fallback logic
58
+ if (
59
+ this.web3Manager instanceof Web3Manager &&
60
+ !this.web3Manager.web3Config.useExternalWeb3
61
+ ) {
62
+ const providerEndpoints =
63
+ this.web3Manager.web3Config.internalWeb3Config.web3ProviderEndpoints
64
+ this.providerSelector = new ProviderSelection(providerEndpoints)
65
+ } else {
66
+ this.providerSelector = null
67
+ }
68
+ }
69
+
70
+ /** Inits the contract if necessary */
71
+ async init() {
72
+ // No-op if we are already initted
73
+ if (this._isInitialized) return
74
+
75
+ // If we are already initting, wait until we are initted and return
76
+ if (this._isInitializing) {
77
+ let interval
78
+ await new Promise<void>((resolve, reject) => {
79
+ interval = setInterval(() => {
80
+ if (this._isInitialized) resolve()
81
+ }, CONTRACT_INITIALIZING_INTERVAL)
82
+ setTimeout(() => {
83
+ reject(new Error('[ContractClient:init()] Initialization timeout'))
84
+ }, CONTRACT_INITIALIZING_TIMEOUT)
85
+ })
86
+ clearInterval(interval)
87
+ return
88
+ }
89
+
90
+ this._isInitializing = true
91
+ try {
92
+ if (!this._contractAddress) {
93
+ this._contractAddress = await this.getRegistryAddress(
94
+ this.contractRegistryKey
95
+ )
96
+ if (
97
+ this._contractAddress === '0x0000000000000000000000000000000000000000'
98
+ ) {
99
+ this._isInitializing = false
100
+ throw new Error(
101
+ `Failed retrieve address for ${this.contractRegistryKey}`
102
+ )
103
+ }
104
+ }
105
+ const web3 = this.web3Manager.getWeb3()
106
+ this._contract = new web3.eth.Contract(
107
+ this.contractABI,
108
+ this._contractAddress
109
+ )
110
+ this._isInitializing = false
111
+ this._isInitialized = !!this._contractAddress
112
+ } catch (e) {
113
+ if (++this._initAttempts >= CONTRACT_INIT_MAX_ATTEMPTS) {
114
+ this.logger.error(
115
+ `Failed to initialize ${this.contractRegistryKey}. Max attempts exceeded.`
116
+ )
117
+ return
118
+ }
119
+
120
+ const selectNewEndpoint = !!this.providerSelector
121
+ this.logger.error(
122
+ `Failed to initialize ${this.contractRegistryKey} on attempt #${this._initAttempts}. Retrying with selectNewEndpoint=${selectNewEndpoint}`
123
+ )
124
+ this._isInitializing = false
125
+ await this.retryInit(selectNewEndpoint)
126
+ }
127
+ }
128
+
129
+ async retryInit(selectNewEndpoint = true) {
130
+ try {
131
+ if (selectNewEndpoint) {
132
+ await this.selectNewEndpoint()
133
+ }
134
+ await this.init()
135
+ } catch (e: any) {
136
+ this.logger.error(e?.message)
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Adds current provider into unhealthy set and selects the next healthy provider
142
+ */
143
+ async selectNewEndpoint() {
144
+ const currentProviderUrl = (
145
+ this.web3Manager.getWeb3().currentProvider as HttpProvider
146
+ ).host
147
+ this.providerSelector?.addUnhealthy(currentProviderUrl)
148
+
149
+ if (
150
+ this.providerSelector?.getUnhealthySize() ===
151
+ this.providerSelector?.getServicesSize()
152
+ ) {
153
+ this.logger.log(
154
+ 'No healthy providers available - resetting ProviderSelection and selecting.'
155
+ )
156
+ this.providerSelector?.clearUnhealthy()
157
+ this.providerSelector?.clearBackups()
158
+ }
159
+
160
+ // Reset _isInitializing to false to retry init logic and avoid the _isInitialzing check
161
+ this._isInitializing = false
162
+ await this.providerSelector?.select(this)
163
+ }
164
+
165
+ /** Gets the contract address and ensures that the contract has initted. */
166
+ async getAddress() {
167
+ await this.init()
168
+ // calling init first ensures _contactAddress is present
169
+ return this._contractAddress as string
170
+ }
171
+
172
+ /**
173
+ * Gets a contract method and ensures that the contract has initted
174
+ * The contract can then be invoked with .call() or be passed to a sendTransaction.
175
+ * @param methodName the name of the contract method
176
+ */
177
+ async getMethod(methodName: string, ...args: any[]) {
178
+ await this.init()
179
+ if (!(methodName in this._contract?.methods)) {
180
+ throw new Error(
181
+ `Contract method ${methodName} not found in ${Object.keys(
182
+ this._contract?.methods
183
+ )}`
184
+ )
185
+ }
186
+ const method = await this._contract?.methods[methodName](...args)
187
+
188
+ // Override method.call (chain reads) with built in retry logic
189
+ const call = method.call
190
+ method.call = async (...args: unknown[]) => {
191
+ return await retry(
192
+ async () => {
193
+ return call(...args)
194
+ },
195
+ {
196
+ // Retry function 5x by default
197
+ // 1st retry delay = 500ms, 2nd = 1500ms, 3rd...nth retry = 4000 ms (capped)
198
+ minTimeout: 500,
199
+ maxTimeout: 4000,
200
+ factor: 3,
201
+ retries: METHOD_CALL_MAX_RETRIES,
202
+ onRetry: (err) => {
203
+ if (err) {
204
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
205
+ this.logger.log(`Retry error for ${methodName} : ${err}`)
206
+ }
207
+ }
208
+ }
209
+ )
210
+ }
211
+
212
+ return method
213
+ }
214
+
215
+ async getEthNetId() {
216
+ await this.init()
217
+ const netId = await this.web3Manager.getWeb3().eth.net.getId()
218
+
219
+ return netId
220
+ }
221
+
222
+ async getContract() {
223
+ await this.init()
224
+ // init ensures _contract is set
225
+ return this._contract as Contract
226
+ }
227
+ }
@@ -0,0 +1,53 @@
1
+ import type { ContractABI, Logger } from '../../utils'
2
+ import type { GovernanceClient } from '../ethContracts/GovernanceClient'
3
+ import type { EthWeb3Manager } from '../ethWeb3Manager'
4
+ import type { Web3Manager } from '../web3Manager'
5
+ import type { GetRegistryAddress } from './ContractClient'
6
+
7
+ import { ContractClient } from './ContractClient'
8
+
9
+ /**
10
+ * Contract class that extends a ContractClient and provides an interface
11
+ * to retrieve governed methods that cannot be executed directly.
12
+ */
13
+ export class GovernedContractClient extends ContractClient {
14
+ governanceClient: GovernanceClient
15
+
16
+ constructor(
17
+ web3Manager: Web3Manager | EthWeb3Manager,
18
+ contractABI: ContractABI['abi'],
19
+ contractRegistryKey: string,
20
+ getRegistryAddress: GetRegistryAddress,
21
+ governanceClient: GovernanceClient,
22
+ logger: Logger = console
23
+ ) {
24
+ super(
25
+ web3Manager,
26
+ contractABI,
27
+ contractRegistryKey,
28
+ getRegistryAddress,
29
+ logger
30
+ )
31
+ this.governanceClient = governanceClient
32
+ }
33
+
34
+ /**
35
+ * Gets a governed version of a method and allows a single transaction
36
+ * to be sent to the governance client with the appropriate payload.
37
+ * Similar to `getMethod`
38
+ */
39
+ async getGovernedMethod(methodName: string, ...args: unknown[]) {
40
+ const contractMethod = await this.getMethod(methodName, ...args)
41
+ const { signature, callData } =
42
+ this.governanceClient.getSignatureAndCallData(methodName, contractMethod)
43
+ const contractRegistryKey = this.web3Manager
44
+ .getWeb3()
45
+ .utils.utf8ToHex(this.contractRegistryKey)
46
+ const method = await this.governanceClient.guardianExecuteTransaction(
47
+ contractRegistryKey,
48
+ signature,
49
+ callData
50
+ )
51
+ return method
52
+ }
53
+ }
@@ -0,0 +1,42 @@
1
+ import Web3 from 'web3'
2
+ import { ServiceSelection } from '../../service-selection'
3
+ import type { EthWeb3Manager } from '../ethWeb3Manager'
4
+ import type { Web3Manager } from '../web3Manager'
5
+
6
+ /**
7
+ * This class provides the logic to select a healthy gateway
8
+ */
9
+ export class ProviderSelection extends ServiceSelection {
10
+ services: string[]
11
+
12
+ constructor(services: string[] = []) {
13
+ super({
14
+ whitelist: new Set(),
15
+ getServices: async () => this.services
16
+ })
17
+
18
+ this.services = services
19
+ }
20
+
21
+ /**
22
+ * Filters out previously tried providers, and then initializes the client
23
+ * (ContractClient, RegistryClient) with a healthy POA provider.
24
+ *
25
+ * @param client object used for making transaction calls
26
+ */
27
+ override async select(client: { web3Manager: Web3Manager | EthWeb3Manager }) {
28
+ const web3Manager = client.web3Manager as Web3Manager
29
+ const filteredServices = this.filterOutKnownUnhealthy(
30
+ await this.getServices()
31
+ )
32
+ const web3 = new Web3(
33
+ web3Manager.provider(filteredServices[0] as string, 10000)
34
+ )
35
+
36
+ web3Manager.setWeb3(web3)
37
+ }
38
+
39
+ getServicesSize() {
40
+ return this.services.length
41
+ }
42
+ }