@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.
- package/.eslintrc +38 -0
- package/.prettierrc.js +1 -0
- package/.python-version +1 -0
- package/Dockerfile +15 -0
- package/README.md +3 -0
- package/babel.config.js +3 -0
- package/data-contracts/ABIs/AdminUpgradeabilityProxy.json +132 -0
- package/data-contracts/ABIs/BaseAdminUpgradeabilityProxy.json +113 -0
- package/data-contracts/ABIs/BaseUpgradeabilityProxy.json +22 -0
- package/data-contracts/ABIs/DiscoveryProviderFactory.json +189 -0
- package/data-contracts/ABIs/DiscoveryProviderFactoryInterface.json +61 -0
- package/data-contracts/ABIs/DiscoveryProviderStorage.json +205 -0
- package/data-contracts/ABIs/DiscoveryProviderStorageInterface.json +65 -0
- package/data-contracts/ABIs/ECDSA.json +4 -0
- package/data-contracts/ABIs/IPLDBlacklistFactory.json +168 -0
- package/data-contracts/ABIs/Initializable.json +4 -0
- package/data-contracts/ABIs/Migrations.json +67 -0
- package/data-contracts/ABIs/OpenZeppelinUpgradesAddress.json +4 -0
- package/data-contracts/ABIs/Ownable.json +79 -0
- package/data-contracts/ABIs/PlaylistFactory.json +669 -0
- package/data-contracts/ABIs/PlaylistFactoryInterface.json +42 -0
- package/data-contracts/ABIs/PlaylistStorage.json +250 -0
- package/data-contracts/ABIs/PlaylistStorageInterface.json +129 -0
- package/data-contracts/ABIs/Proxy.json +10 -0
- package/data-contracts/ABIs/Registry.json +240 -0
- package/data-contracts/ABIs/RegistryContract.json +102 -0
- package/data-contracts/ABIs/RegistryContractInterface.json +28 -0
- package/data-contracts/ABIs/RegistryInterface.json +66 -0
- package/data-contracts/ABIs/SigningLogic.json +43 -0
- package/data-contracts/ABIs/SigningLogicInitializable.json +46 -0
- package/data-contracts/ABIs/SocialFeatureFactory.json +460 -0
- package/data-contracts/ABIs/SocialFeatureStorage.json +225 -0
- package/data-contracts/ABIs/SocialFeatureStorageInterface.json +123 -0
- package/data-contracts/ABIs/TestContract.json +135 -0
- package/data-contracts/ABIs/TestContractInterface.json +19 -0
- package/data-contracts/ABIs/TestContractWithStorage.json +165 -0
- package/data-contracts/ABIs/TestContractWithStorageInterface.json +24 -0
- package/data-contracts/ABIs/TestStorage.json +144 -0
- package/data-contracts/ABIs/TestStorageInterface.json +42 -0
- package/data-contracts/ABIs/TestUserReplicaSetManager.json +432 -0
- package/data-contracts/ABIs/TrackFactory.json +391 -0
- package/data-contracts/ABIs/TrackFactoryInterface.json +73 -0
- package/data-contracts/ABIs/TrackStorage.json +223 -0
- package/data-contracts/ABIs/TrackStorageInterface.json +121 -0
- package/data-contracts/ABIs/UpgradeabilityProxy.json +37 -0
- package/data-contracts/ABIs/UserFactory.json +657 -0
- package/data-contracts/ABIs/UserFactoryInterface.json +65 -0
- package/data-contracts/ABIs/UserLibraryFactory.json +334 -0
- package/data-contracts/ABIs/UserReplicaSetManager.json +418 -0
- package/data-contracts/ABIs/UserStorage.json +233 -0
- package/data-contracts/ABIs/UserStorageInterface.json +93 -0
- package/data-contracts/signatureSchemas.ts +1236 -0
- package/dist/core.d.ts +446 -0
- package/dist/core.js +769 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +689 -0
- package/dist/index.js +72850 -0
- package/dist/index.js.map +1 -0
- package/eth-contracts/ABIs/Address.json +4 -0
- package/eth-contracts/ABIs/AudiusAdminUpgradeabilityProxy.json +105 -0
- package/eth-contracts/ABIs/AudiusClaimDistributor.json +4968 -0
- package/eth-contracts/ABIs/AudiusToken.json +724 -0
- package/eth-contracts/ABIs/BaseUpgradeabilityProxy.json +23 -0
- package/eth-contracts/ABIs/Checkpointing.json +4 -0
- package/eth-contracts/ABIs/ClaimsManager.json +539 -0
- package/eth-contracts/ABIs/Context.json +11 -0
- package/eth-contracts/ABIs/DelegateManager.json +989 -0
- package/eth-contracts/ABIs/DelegateManagerV2.json +1049 -0
- package/eth-contracts/ABIs/DelegateManagerV2Bad.json +1049 -0
- package/eth-contracts/ABIs/ERC20.json +252 -0
- package/eth-contracts/ABIs/ERC20Burnable.json +287 -0
- package/eth-contracts/ABIs/ERC20Detailed.json +270 -0
- package/eth-contracts/ABIs/ERC20Mintable.json +364 -0
- package/eth-contracts/ABIs/ERC20Pausable.json +397 -0
- package/eth-contracts/ABIs/EthRewardsManager.json +174 -0
- package/eth-contracts/ABIs/Governance.json +938 -0
- package/eth-contracts/ABIs/GovernanceUpgraded.json +953 -0
- package/eth-contracts/ABIs/GovernanceV2.json +938 -0
- package/eth-contracts/ABIs/IERC20.json +200 -0
- package/eth-contracts/ABIs/Initializable.json +4 -0
- package/eth-contracts/ABIs/InitializableV2.json +14 -0
- package/eth-contracts/ABIs/Migrations.json +71 -0
- package/eth-contracts/ABIs/MinterRole.json +91 -0
- package/eth-contracts/ABIs/MockAccount.json +62 -0
- package/eth-contracts/ABIs/MockDelegateManager.json +55 -0
- package/eth-contracts/ABIs/MockStakingCaller.json +259 -0
- package/eth-contracts/ABIs/MockWormhole.json +106 -0
- package/eth-contracts/ABIs/OpenZeppelinUpgradesAddress.json +4 -0
- package/eth-contracts/ABIs/Ownable.json +93 -0
- package/eth-contracts/ABIs/Pausable.json +150 -0
- package/eth-contracts/ABIs/PauserRole.json +91 -0
- package/eth-contracts/ABIs/Proxy.json +10 -0
- package/eth-contracts/ABIs/Registry.json +288 -0
- package/eth-contracts/ABIs/Roles.json +4 -0
- package/eth-contracts/ABIs/SafeERC20.json +4 -0
- package/eth-contracts/ABIs/SafeMath.json +4 -0
- package/eth-contracts/ABIs/ServiceProviderFactory.json +1153 -0
- package/eth-contracts/ABIs/ServiceTypeManager.json +337 -0
- package/eth-contracts/ABIs/Staking.json +555 -0
- package/eth-contracts/ABIs/StakingUpgraded.json +570 -0
- package/eth-contracts/ABIs/TestContract.json +44 -0
- package/eth-contracts/ABIs/TrustedNotifierManager.json +265 -0
- package/eth-contracts/ABIs/Uint256Helpers.json +4 -0
- package/eth-contracts/ABIs/UpgradeabilityProxy.json +40 -0
- package/eth-contracts/ABIs/Wormhole.json +45 -0
- package/eth-contracts/ABIs/WormholeClient.json +155 -0
- package/examples/file.mp3 +0 -0
- package/examples/initAudiusLibs.js +86 -0
- package/examples/initializeVersions.js +95 -0
- package/examples/pic.jpg +0 -0
- package/initScripts/configureLocalDiscProv.js +167 -0
- package/initScripts/helpers/claim.js +43 -0
- package/initScripts/helpers/distributeTokens.js +24 -0
- package/initScripts/helpers/spRegistration.js +138 -0
- package/initScripts/helpers/utils.js +34 -0
- package/initScripts/helpers/version.js +93 -0
- package/initScripts/local.js +617 -0
- package/initScripts/mainnet.js +131 -0
- package/initScripts/manageProdRelayerWallets.js +191 -0
- package/package.json +125 -0
- package/rollup.config.js +164 -0
- package/scripts/AudiusClaimDistributor.json +4968 -0
- package/scripts/Wormhole.json +155 -0
- package/scripts/addCIDToIpldBlacklist.js +124 -0
- package/scripts/circleci-test.sh +53 -0
- package/scripts/communityRewards/transferCommunityRewardsToSolana.js +222 -0
- package/scripts/ipfs.sh +58 -0
- package/scripts/migrate_contracts.sh +25 -0
- package/scripts/reset.sh +65 -0
- package/scripts/test.sh +77 -0
- package/src/api/account.js +670 -0
- package/src/api/base.js +122 -0
- package/src/api/file.js +168 -0
- package/src/api/playlist.js +328 -0
- package/src/api/rewards.d.ts +4 -0
- package/src/api/rewards.js +682 -0
- package/src/api/serviceProvider.js +154 -0
- package/src/api/track.js +604 -0
- package/src/api/user.js +888 -0
- package/src/api/user.test.js +172 -0
- package/src/constants.ts +7 -0
- package/src/core.ts +3 -0
- package/src/index.js +6 -0
- package/src/libs.d.ts +3 -0
- package/src/libs.js +619 -0
- package/src/sanityChecks/addSecondaries.js +40 -0
- package/src/sanityChecks/assignReplicaSetIfNecessary.js +10 -0
- package/src/sanityChecks/index.d.ts +9 -0
- package/src/sanityChecks/index.js +31 -0
- package/src/sanityChecks/isCreator.js +73 -0
- package/src/sanityChecks/needsRecoveryEmail.js +20 -0
- package/src/sanityChecks/rolloverNodes.js +74 -0
- package/src/sanityChecks/sanitizeNodes.js +24 -0
- package/src/sanityChecks/syncNodes.js +28 -0
- package/src/sdk/constants.ts +10 -0
- package/src/sdk/index.ts +1 -0
- package/src/sdk/oauth/Oauth.ts +265 -0
- package/src/sdk/oauth/index.ts +1 -0
- package/src/sdk/sdk.ts +102 -0
- package/src/service-selection/ServiceSelection.test.ts +320 -0
- package/src/service-selection/ServiceSelection.ts +460 -0
- package/src/service-selection/constants.ts +14 -0
- package/src/service-selection/index.ts +1 -0
- package/src/services/ABIDecoder/AudiusABIDecoder.ts +71 -0
- package/src/services/ABIDecoder/index.ts +1 -0
- package/src/services/comstock/Comstock.ts +39 -0
- package/src/services/comstock/index.ts +1 -0
- package/src/services/contracts/ContractClient.ts +227 -0
- package/src/services/contracts/GovernedContractClient.ts +53 -0
- package/src/services/contracts/ProviderSelection.ts +42 -0
- package/src/services/creatorNode/CreatorNode.ts +1065 -0
- package/src/services/creatorNode/CreatorNodeSelection.test.ts +997 -0
- package/src/services/creatorNode/CreatorNodeSelection.ts +488 -0
- package/src/services/creatorNode/constants.ts +10 -0
- package/src/services/creatorNode/index.ts +2 -0
- package/src/services/dataContracts/AudiusContracts.ts +234 -0
- package/src/services/dataContracts/IPLDBlacklistFactoryClient.ts +73 -0
- package/src/services/dataContracts/PlaylistFactoryClient.ts +370 -0
- package/src/services/dataContracts/RegistryClient.ts +95 -0
- package/src/services/dataContracts/SocialFeatureFactoryClient.ts +196 -0
- package/src/services/dataContracts/TrackFactoryClient.ts +131 -0
- package/src/services/dataContracts/UserFactoryClient.ts +351 -0
- package/src/services/dataContracts/UserLibraryFactoryClient.ts +115 -0
- package/src/services/dataContracts/UserReplicaSetManagerClient.ts +206 -0
- package/src/services/dataContracts/index.ts +1 -0
- package/src/services/discoveryProvider/DiscoveryProvider.ts +1168 -0
- package/src/services/discoveryProvider/DiscoveryProviderSelection.test.ts +536 -0
- package/src/services/discoveryProvider/DiscoveryProviderSelection.ts +383 -0
- package/src/services/discoveryProvider/constants.ts +13 -0
- package/src/services/discoveryProvider/index.ts +1 -0
- package/src/services/discoveryProvider/requests.ts +629 -0
- package/src/services/ethContracts/AudiusTokenClient.ts +163 -0
- package/src/services/ethContracts/ClaimDistributionClient.ts +45 -0
- package/src/services/ethContracts/ClaimsManagerClient.ts +102 -0
- package/src/services/ethContracts/DelegateManagerClient.ts +480 -0
- package/src/services/ethContracts/EthContracts.ts +359 -0
- package/src/services/ethContracts/EthRewardsManagerClient.ts +33 -0
- package/src/services/ethContracts/GovernanceClient.ts +451 -0
- package/src/services/ethContracts/RegistryClient.ts +33 -0
- package/src/services/ethContracts/ServiceProviderFactoryClient.ts +691 -0
- package/src/services/ethContracts/ServiceTypeManagerClient.ts +112 -0
- package/src/services/ethContracts/StakingProxyClient.ts +97 -0
- package/src/services/ethContracts/TrustedNotifierManagerClient.ts +101 -0
- package/src/services/ethContracts/WormholeClient.ts +97 -0
- package/src/services/ethContracts/index.ts +1 -0
- package/src/services/ethWeb3Manager/EthWeb3Manager.ts +239 -0
- package/src/services/ethWeb3Manager/index.ts +1 -0
- package/src/services/hedgehog/Hedgehog.ts +96 -0
- package/src/services/hedgehog/index.ts +1 -0
- package/src/services/identity/IdentityService.ts +551 -0
- package/src/services/identity/index.ts +1 -0
- package/src/services/identity/requests.ts +65 -0
- package/src/services/schemaValidator/SchemaValidator.ts +105 -0
- package/src/services/schemaValidator/index.ts +1 -0
- package/src/services/schemaValidator/schemas/trackSchema.json +267 -0
- package/src/services/schemaValidator/schemas/userSchema.json +230 -0
- package/src/services/solanaAudiusData/errors.ts +20 -0
- package/src/services/solanaAudiusData/index.ts +1189 -0
- package/src/services/solanaWeb3Manager/errors.js +101 -0
- package/src/services/solanaWeb3Manager/index.d.ts +46 -0
- package/src/services/solanaWeb3Manager/index.js +655 -0
- package/src/services/solanaWeb3Manager/padBNToUint8Array.ts +7 -0
- package/src/services/solanaWeb3Manager/rewards.js +941 -0
- package/src/services/solanaWeb3Manager/rewardsAttester.ts +1093 -0
- package/src/services/solanaWeb3Manager/tokenAccount.js +149 -0
- package/src/services/solanaWeb3Manager/transactionHandler.js +345 -0
- package/src/services/solanaWeb3Manager/transfer.js +272 -0
- package/src/services/solanaWeb3Manager/userBank.js +160 -0
- package/src/services/solanaWeb3Manager/utils.d.ts +31 -0
- package/src/services/solanaWeb3Manager/utils.js +163 -0
- package/src/services/solanaWeb3Manager/wAudio.js +28 -0
- package/src/services/solanaWeb3Manager/wAudio.test.js +30 -0
- package/src/services/web3Manager/Web3Config.ts +14 -0
- package/src/services/web3Manager/Web3Manager.ts +360 -0
- package/src/services/web3Manager/XMLHttpRequest.ts +11 -0
- package/src/services/web3Manager/index.ts +2 -0
- package/src/services/wormhole/index.js +424 -0
- package/src/types.ts +8 -0
- package/src/userStateManager.ts +53 -0
- package/src/utils/apiSigning.ts +51 -0
- package/src/utils/captcha.ts +97 -0
- package/src/utils/estimateGas.ts +64 -0
- package/src/utils/fileHasher.ts +278 -0
- package/src/utils/importContractABI.d.ts +9 -0
- package/src/utils/importContractABI.js +19 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/multiProvider.ts +72 -0
- package/src/utils/network.test.ts +127 -0
- package/src/utils/network.ts +308 -0
- package/src/utils/promiseFight.test.ts +87 -0
- package/src/utils/promiseFight.ts +36 -0
- package/src/utils/signatures.ts +139 -0
- package/src/utils/types.ts +34 -0
- package/src/utils/utils.test.ts +36 -0
- package/src/utils/utils.ts +235 -0
- package/src/utils/uuid.ts +14 -0
- package/src/web3.d.ts +9 -0
- package/src/web3.js +8 -0
- package/tests/assets/static_image.png +0 -0
- package/tests/assets/static_text.txt +1 -0
- package/tests/audiusTokenClientTest.js +37 -0
- package/tests/creatorNodeTest.js +19 -0
- package/tests/fileHasherTest.js +125 -0
- package/tests/governanceTest.js +382 -0
- package/tests/helpers.js +105 -0
- package/tests/index.js +14 -0
- package/tests/playlistClientTest.js +157 -0
- package/tests/providerSelectionTest.js +241 -0
- package/tests/registryClientTest.js +19 -0
- package/tests/rewardsAttesterTest.js +373 -0
- package/tests/serviceTypeManagerClientTest.js +33 -0
- package/tests/socialFeatureClientTest.js +79 -0
- package/tests/stakingTest.js +302 -0
- package/tests/trackClientTest.js +86 -0
- package/tests/userClientTest.js +121 -0
- package/tsconfig.json +10 -0
- package/types/@audius-hedgehog/index.d.ts +39 -0
- 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
|
+
}
|