@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,617 @@
1
+ const fs = require('fs')
2
+ const readline = require('readline')
3
+
4
+ const initAudiusLibs = require('../examples/initAudiusLibs')
5
+ const dataContractsConfig = require('../data-contracts/config.json')
6
+ const { distributeTokens } = require('./helpers/distributeTokens')
7
+ const { setServiceVersion, addServiceType } = require('./helpers/version')
8
+ const {
9
+ registerLocalService,
10
+ queryLocalServices,
11
+ getStakingParameters,
12
+ updateServiceDelegateOwnerWallet
13
+ } = require('./helpers/spRegistration')
14
+ const { deregisterLocalService } = require('./helpers/spRegistration')
15
+ const { getClaimInfo, fundNewClaim } = require('./helpers/claim')
16
+ const { getEthContractAccounts } = require('./helpers/utils')
17
+
18
+ // Directories within the audius-protocol repository used for development
19
+ const serviceDirectoryList = ['discovery-provider', 'creator-node']
20
+ const discProvEndpoint1 = 'http://dn1_web-server_1:5000'
21
+ const discProvEndpoint2 = 'http://dn2_web-server_1:5001'
22
+ const creatorNodeEndpoint1 = 'http://cn1_creator-node_1:4000'
23
+ const creatorNodeEndpoint2 = 'http://cn2_creator-node_1:4001'
24
+ const creatorNodeEndpoint3 = 'http://cn3_creator-node_1:4002'
25
+ const creatorNodeEndpoint4 = 'http://cn4_creator-node_1:4003'
26
+ const amountOfAuds = 2000000
27
+
28
+ const contentNodeType = 'content-node'
29
+ const contentNodeTypeMin = 200000
30
+ const contentNodeTypeMax = 10000000
31
+
32
+ const discoveryNodeType = 'discovery-node'
33
+ const discoveryNodeTypeMin = 200000
34
+ const discoveryNodeTypeMax = 7000000
35
+
36
+ const DISCOVERY_WALLET_OFFSET = 8
37
+
38
+ // try to dynamically get versions from .version.json
39
+ const serviceVersions = {}
40
+ const serviceTypesList = []
41
+ try {
42
+ serviceDirectoryList.forEach((type) => {
43
+ const typeInfo = require(`../../${type}/.version.json`)
44
+ const version = typeInfo.version
45
+ const serviceType = typeInfo.service
46
+ serviceVersions[serviceType] = version
47
+ serviceTypesList.push(serviceType)
48
+ })
49
+ } catch (e) {
50
+ throw new Error("Couldn't get the service versions")
51
+ }
52
+
53
+ const throwArgError = () => {
54
+ throw new Error(`missing argument - format: node local.js [
55
+ distribute,
56
+ fundclaim,
57
+ getclaim,
58
+ stakeinfo,
59
+ setversion,
60
+ register-sps,
61
+ deregister-sps,
62
+ query-sps,
63
+ init-all
64
+ ]`)
65
+ }
66
+
67
+ const args = process.argv
68
+ if (args.length < 3) {
69
+ throwArgError()
70
+ }
71
+
72
+ const getEnvConfigPathsForService = async ({ workspace, serviceCount }) => {
73
+ const tmpDir = `${workspace}/tmp`
74
+ const writePath = `${tmpDir}/shellEnv${serviceCount}.sh`
75
+ const dirExists = fs.existsSync(tmpDir)
76
+ if (!dirExists) {
77
+ fs.mkdirSync(tmpDir)
78
+ } else {
79
+ const cleanupNeeded = fs.existsSync(writePath)
80
+ if (cleanupNeeded) {
81
+ fs.rmSync(writePath, { force: true })
82
+ }
83
+ }
84
+ const templatePath = `${workspace}/commonEnv.sh`
85
+ const envPath = `${workspace}/shellEnv${serviceCount}.sh`
86
+ fs.copyFileSync(envPath, writePath)
87
+ return { templatePath, writePath }
88
+ }
89
+
90
+ const run = async () => {
91
+ try {
92
+ const audiusLibs = await initAudiusLibs(true)
93
+ // A separate libs instance
94
+ let userReplicaBootstrapAddressLibs
95
+ const ethWeb3 = audiusLibs.ethWeb3Manager.getWeb3()
96
+ const ethAccounts = await ethWeb3.eth.getAccounts()
97
+
98
+ switch (args[2]) {
99
+ case 'init':
100
+ console.log('initialized libs')
101
+ break
102
+ case 'distribute':
103
+ await distributeTokens(audiusLibs, amountOfAuds)
104
+ break
105
+
106
+ case 'fundclaim':
107
+ await fundNewClaim(audiusLibs, amountOfAuds)
108
+ break
109
+
110
+ case 'getclaim':
111
+ await getClaimInfo(audiusLibs)
112
+ break
113
+
114
+ case 'stakeinfo':
115
+ await getStakingParameters(audiusLibs)
116
+ break
117
+
118
+ case 'setversion':
119
+ await _initAllVersions(audiusLibs)
120
+ break
121
+
122
+ case 'configure-discprov-wallet': {
123
+ const serviceCount = args[3]
124
+ if (serviceCount === undefined) throw new Error('configure-discprov-wallet requires a service # as the second arg')
125
+ const workspace = '../discovery-provider/compose/env'
126
+ const { templatePath, writePath } = await getEnvConfigPathsForService({ workspace, serviceCount })
127
+ await _configureDiscProv(ethAccounts, parseInt(serviceCount), templatePath, writePath)
128
+ break
129
+ }
130
+
131
+ case 'register-discovery-node':
132
+ const serviceCount = args[3]
133
+ if (serviceCount === undefined) throw new Error('register-discovery-node requires a service # as the second arg')
134
+ await _registerDiscProv(ethAccounts, parseInt(serviceCount))
135
+ break
136
+
137
+ case 'register-cnode': {
138
+ const serviceCount = args[3]
139
+ if (serviceCount === undefined) throw new Error('register-cnode requires a service # as the second arg')
140
+ await _registerCnode(ethAccounts, parseInt(serviceCount))
141
+ break
142
+ }
143
+ case 'deregister-cnode': {
144
+ const serviceCount = args[3]
145
+ if (serviceCount === undefined) throw new Error('deregister-cnode requires a service # as the second arg')
146
+ await _deregisterCnode(ethAccounts, parseInt(serviceCount))
147
+ break
148
+ }
149
+
150
+ case 'print-accounts': {
151
+ const numAccounts = args[3] || 20
152
+ await _printEthContractAccounts(ethAccounts, numAccounts)
153
+ break
154
+ }
155
+
156
+ case 'update-cnode-delegate-wallet': {
157
+ const serviceCount = args[3]
158
+ if (serviceCount === undefined) throw new Error('register-cnode requires a service # as the second arg')
159
+ await _updateCNodeDelegateOwnerWallet(ethAccounts, parseInt(serviceCount))
160
+ break
161
+ }
162
+
163
+ case 'deregister-sps':
164
+ await _deregisterAllSPs(audiusLibs, ethAccounts)
165
+ break
166
+
167
+ case 'query-sps':
168
+ await queryLocalServices(audiusLibs, serviceTypesList)
169
+ break
170
+
171
+ case 'query-sps-ursm':
172
+ await queryLocalServices(audiusLibs, serviceTypesList, true)
173
+ break
174
+
175
+ case 'update-cnode-config': {
176
+ // Update arbitrary cnode
177
+ const serviceCount = args[3]
178
+ if (serviceCount === undefined) throw new Error('update-delegate-wallet requires a service # as the second arg')
179
+ const workspace = '../creator-node/compose/env'
180
+ const { templatePath, writePath } = await getEnvConfigPathsForService({ workspace, serviceCount })
181
+ // Local dev, delegate and owner wallet are equal
182
+ const ownerWallet = ethAccounts[parseInt(serviceCount)]
183
+ const delegateWallet = ownerWallet
184
+ const endpoint = makeCreatorNodeEndpoint(serviceCount)
185
+
186
+ await _updateCreatorNodeConfig(ownerWallet, templatePath, writePath, endpoint, /* isShell */ true, delegateWallet)
187
+ break
188
+ }
189
+
190
+ case 'init-all':
191
+ await _initializeLocalEnvironment(audiusLibs, ethAccounts)
192
+ break
193
+
194
+ case 'update-userreplicasetmanager-init-config':
195
+ await _updateUserReplicaSetManagerBootstrapConfig(ethAccounts)
196
+ break
197
+
198
+ case 'update-user-replica-set':
199
+ console.log('Usage: node local.js update-user-replica-set userId=1 primary=2 secondaries=3,1')
200
+ const userIdStr = args[3]
201
+ const primaryReplicaIdStr = args[4]
202
+ const secondaryReplicaIdStr = args[5]
203
+ const userId = parseInt(userIdStr.split('=')[1])
204
+ const primaryReplicaId = parseInt(primaryReplicaIdStr.split('=')[1])
205
+ let secondaryReplicaIds = (secondaryReplicaIdStr.split('=')[1])
206
+ secondaryReplicaIds = secondaryReplicaIds.split(',').map(x => parseInt(x))
207
+ console.log(`Received userId: ${userId}`)
208
+ console.log(`Received primaryReplicaId: ${primaryReplicaId}`)
209
+ console.log(`Received secondaryReplicaIds: ${secondaryReplicaIds}`)
210
+ await updateUserReplicaSet(audiusLibs, userId, primaryReplicaId, secondaryReplicaIds)
211
+ break
212
+
213
+ case 'query-user-replica-set':
214
+ console.log('Usage: node local.js query-user-replica-set userId=1')
215
+ userReplicaBootstrapAddressLibs = await getUrsmLibs(audiusLibs, 9)
216
+ const userReplicaSet = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getUserReplicaSet(
217
+ parseInt(
218
+ args[3].split('=')[1]
219
+ )
220
+ )
221
+ console.log(userReplicaSet)
222
+ break
223
+
224
+ case 'query-ursm-content-node-wallet':
225
+ console.log('Usage: node local.js query-ursm-content-node-wallet spId=1')
226
+ userReplicaBootstrapAddressLibs = await getUrsmLibs(audiusLibs, 9)
227
+ const contentNodeWallet = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getContentNodeWallets(
228
+ parseInt(
229
+ args[3].split('=')[1]
230
+ )
231
+ )
232
+ console.log(contentNodeWallet)
233
+ break
234
+
235
+ case 'add-l2-content-node':
236
+ console.log('Usage: node local.js add-l2-content-node spId=4 delegateWallet=0x95b6A2Be3423dF7D5774...')
237
+ const spIdStr = args[3]
238
+ const spID = parseInt(spIdStr.split('=')[1])
239
+ const delegateWalletStr = args[4]
240
+ const delegateWallet = delegateWalletStr.split('=')[1]
241
+ const ownerWallet = delegateWallet
242
+ console.log(`Configuring L2 ${spID} with wallet: ${delegateWallet}`)
243
+ // Initialize from a different acct than proxy admin
244
+ const queryLibs = await getUrsmLibs(audiusLibs, 9)
245
+ await addL2ContentNode(
246
+ queryLibs,
247
+ ethAccounts,
248
+ spID,
249
+ delegateWallet,
250
+ ownerWallet)
251
+ break
252
+
253
+ case 'register-trusted-notifier':
254
+ // hardcoded in trusted-notifier .env.dev
255
+ const wallet = '0xe82a5a2948d2b5e71232f640777346869817fbae'
256
+ const endpoint = 'http://trusted_notifier_service:8000'
257
+ const email = 'email@trusted_notifier_service:8000'
258
+ await audiusLibs.ethContracts.TrustedNotifierManagerClient.registerNotifier(
259
+ wallet,
260
+ endpoint,
261
+ email
262
+ )
263
+ break
264
+
265
+ case 'query-trusted-notifier':
266
+ const id = args[3]
267
+ if (!id) throw new Error('Please pass in a valid ID')
268
+ const resp = await audiusLibs.ethContracts.TrustedNotifierManagerClient.getNotifierForID(id)
269
+ console.log(resp)
270
+ break
271
+
272
+ default:
273
+ throwArgError()
274
+ }
275
+
276
+ process.exit(0)
277
+ } catch (e) {
278
+ throw e
279
+ }
280
+ }
281
+
282
+ run()
283
+
284
+ /*
285
+ Helper function to bootstrap additional local content nodes onto the L2 local network
286
+ Assumes 3 content nodes are already up prior to execution
287
+ */
288
+ const addL2ContentNode = async (
289
+ audiusLibs,
290
+ ethAccounts,
291
+ newCnodeId,
292
+ newCnodeDelegateWallet,
293
+ newCnodeOwnerWallet
294
+ ) => {
295
+ const incomingWallets = [newCnodeDelegateWallet, newCnodeOwnerWallet]
296
+ const existingWalletInfo = await audiusLibs.contracts.UserReplicaSetManagerClient.getContentNodeWallets(newCnodeId)
297
+ const existingWalletToCnodeIdL2 = existingWalletInfo.delegateOwnerWallet
298
+ const spIdToWalletPresent = (existingWalletToCnodeIdL2 === newCnodeDelegateWallet)
299
+ if (spIdToWalletPresent) {
300
+ console.log(`No update required! Found ${existingWalletToCnodeIdL2} for spId=${newCnodeId}, expected ${newCnodeDelegateWallet}`)
301
+ // return
302
+ }
303
+ console.log(`addL2ContentNode: ${newCnodeId}, ${newCnodeDelegateWallet}`)
304
+ const ganacheEthAccounts = await getEthContractAccounts()
305
+ // cn1, cn2, cn3 are all initialized to the 1,2,3 indexes into local ethAccounts array
306
+ // NOTE: Proposer Accounts must match the deployed bootstrap addresses on UserReplicaSetManager
307
+ // Changing any of the below indices will affect the wallets performing this update and operations will fail
308
+ const proposer1WalletIndex = 1
309
+ const proposer2WalletIndex = 2
310
+ const proposer3WalletIndex = 3
311
+ // Local service provider IDs assigned by eth-contracts
312
+ // These values just HAPPEN to coincide with the indices above but are set explicitly to avoid confusion
313
+ const proposer1SpId = 1
314
+ const proposer2SpId = 2
315
+ const proposer3SpId = 3
316
+ // Retrieve the wallet associated with each index
317
+ const proposer1Wallet = ethAccounts[parseInt(proposer1WalletIndex)]
318
+ const proposer1PKey = ganacheEthAccounts.private_keys[proposer1Wallet.toLowerCase()]
319
+ const proposer2Wallet = ethAccounts[parseInt(proposer2WalletIndex)]
320
+ const proposer2PKey = ganacheEthAccounts.private_keys[proposer2Wallet.toLowerCase()]
321
+ const proposer3Wallet = ethAccounts[parseInt(proposer3WalletIndex)]
322
+ const proposer3PKey = ganacheEthAccounts.private_keys[proposer3Wallet.toLowerCase()]
323
+
324
+ console.log(`proposer1Wallet: ${proposer1Wallet}`)
325
+ console.log(`proposer1WalletPkey: ${proposer1PKey}`)
326
+ console.log(`proposer2Wallet: ${proposer2Wallet}`)
327
+ console.log(`proposer2WalletPkey: ${proposer2PKey}`)
328
+ console.log(`proposer3Wallet: ${proposer3Wallet}`)
329
+ console.log(`proposer3WalletPkey: ${proposer3PKey}`)
330
+
331
+ // console.dir(ganacheEthAccounts)
332
+
333
+ // Initialize libs with each incoming proposer
334
+ const proposer1Libs = await initAudiusLibs(
335
+ false,
336
+ proposer1Wallet,
337
+ proposer1Wallet,
338
+ proposer1PKey
339
+ )
340
+ const proposer1EthAddress = proposer1Libs.ethWeb3Manager.getWalletAddress()
341
+ console.log(`Initialized proposer1 libs, proposer1EthAddress: ${proposer1EthAddress}`)
342
+ const proposer1SignatureInfo = await proposer1Libs.contracts.UserReplicaSetManagerClient.getProposeAddOrUpdateContentNodeRequestData(
343
+ newCnodeId,
344
+ newCnodeDelegateWallet,
345
+ newCnodeOwnerWallet,
346
+ proposer1SpId
347
+ )
348
+ console.dir(proposer1SignatureInfo, { depth: 5 })
349
+ const proposer2Libs = await initAudiusLibs(
350
+ false,
351
+ proposer2Wallet,
352
+ proposer2Wallet,
353
+ proposer2PKey
354
+ )
355
+ const proposer2EthAddress = proposer2Libs.ethWeb3Manager.getWalletAddress()
356
+ console.log(`Initialized proposer2 libs, proposer2EthAddress: ${proposer2EthAddress}`)
357
+ const proposer2SignatureInfo = await proposer2Libs.contracts.UserReplicaSetManagerClient.getProposeAddOrUpdateContentNodeRequestData(
358
+ newCnodeId,
359
+ newCnodeDelegateWallet,
360
+ newCnodeOwnerWallet,
361
+ proposer2SpId
362
+ )
363
+ console.dir(proposer2SignatureInfo, { depth: 5 })
364
+ const proposer3Libs = await initAudiusLibs(
365
+ false,
366
+ proposer3Wallet,
367
+ proposer3Wallet,
368
+ proposer3PKey
369
+ )
370
+ const proposer3EthAddress = proposer3Libs.ethWeb3Manager.getWalletAddress()
371
+ console.log(`Initialized proposer3 libs, proposer3EthAddress: ${proposer3EthAddress}`)
372
+ const proposer3SignatureInfo = await proposer3Libs.contracts.UserReplicaSetManagerClient.getProposeAddOrUpdateContentNodeRequestData(
373
+ newCnodeId,
374
+ newCnodeDelegateWallet,
375
+ newCnodeOwnerWallet,
376
+ proposer3SpId
377
+ )
378
+ console.dir(proposer3SignatureInfo, { depth: 5 })
379
+ // Generate arguments for proposal
380
+ const proposerSpIds = [proposer1SpId, proposer2SpId, proposer3SpId]
381
+ const proposerNonces = [
382
+ proposer1SignatureInfo.nonce,
383
+ proposer2SignatureInfo.nonce,
384
+ proposer3SignatureInfo.nonce
385
+ ]
386
+ await audiusLibs.contracts.UserReplicaSetManagerClient.addOrUpdateContentNode(
387
+ newCnodeId,
388
+ incomingWallets,
389
+ proposerSpIds,
390
+ proposerNonces,
391
+ proposer1SignatureInfo.sig,
392
+ proposer2SignatureInfo.sig,
393
+ proposer3SignatureInfo.sig
394
+ )
395
+ }
396
+
397
+ // In order to issue operations we need a libs account initialized from a different address than
398
+ // the 0th account on local data-contracts
399
+ // This function explicitly queries the 20th account from data-contracts ganache
400
+ // Returns libs instance logged in as said account
401
+ const getUrsmLibs = async (defaultAudiusLibs, acctIndex = 20) => {
402
+ const dataWeb3 = defaultAudiusLibs.web3Manager.getWeb3()
403
+ const dataWeb3Accounts = await dataWeb3.eth.getAccounts()
404
+ const localQueryAccount = dataWeb3Accounts[acctIndex]
405
+ const ursmLibs = await initAudiusLibs(true, localQueryAccount)
406
+ return ursmLibs
407
+ }
408
+
409
+ // Update a user's replica set on chain
410
+ // Using the bootstrap address configured for local development (accounts[9])
411
+ const updateUserReplicaSet = async (
412
+ defaultAudiusLibs,
413
+ userId,
414
+ primaryId,
415
+ secondaryIds
416
+ ) => {
417
+ // UserReplicaBootstrapLibs, logged in as the known bootstrap address
418
+ const userReplicaBootstrapAddressLibs = await getUrsmLibs(defaultAudiusLibs, 9)
419
+ const sp1Id = primaryId
420
+ const sp1ContentNodeWallets = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getContentNodeWallets(sp1Id)
421
+ const sp1DelWal = sp1ContentNodeWallets.delegateOwnerWallet
422
+ console.log(`spId <-> delegateWallet from UserReplicaSetManager: ${sp1Id} - ${sp1DelWal}`)
423
+ const sp2Id = secondaryIds[0]
424
+ const sp2ContentNodeWallets = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getContentNodeWallets(sp2Id)
425
+ const sp2DelWal = sp2ContentNodeWallets.delegateOwnerWallet
426
+ console.log(`spId <-> delegateWallet from UserReplicaSetManager: ${sp2Id} - ${sp2DelWal}`)
427
+ const sp3Id = secondaryIds[1]
428
+ const sp3ContentNodeWallets = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getContentNodeWallets(sp3Id)
429
+ const sp3DelWal = sp3ContentNodeWallets.delegateOwnerWallet
430
+ console.log(`spId <-> delegateWallet from UserReplicaSetManager: ${sp3Id} - ${sp3DelWal}`)
431
+ const user1ReplicaSet = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getUserReplicaSet(userId)
432
+ console.log(`User ${userId} replica set prior to update: ${JSON.stringify(user1ReplicaSet)}`)
433
+ console.log(`User ${userId} replica set updating to primary=${primaryId}, secondaries=${secondaryIds}`)
434
+ // Uncomment to perform update operation
435
+ const tx1 = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.updateReplicaSet(
436
+ userId,
437
+ primaryId,
438
+ secondaryIds,
439
+ user1ReplicaSet.primary,
440
+ user1ReplicaSet.secondaries
441
+ )
442
+ console.dir(tx1, { depth: 5 })
443
+ const user1ReplicaSetAfterUpdate = await userReplicaBootstrapAddressLibs.contracts.UserReplicaSetManagerClient.getUserReplicaSet(userId)
444
+ console.log(`User ${userId} replica set after to update: ${JSON.stringify(user1ReplicaSetAfterUpdate)}`)
445
+ }
446
+
447
+ const _initializeLocalEnvironment = async (audiusLibs, ethAccounts) => {
448
+ await distributeTokens(audiusLibs, amountOfAuds)
449
+ await _initEthContractTypes(audiusLibs)
450
+ await _initAllVersions(audiusLibs)
451
+ await queryLocalServices(audiusLibs, serviceTypesList)
452
+ }
453
+
454
+ const makeDiscoveryProviderEndpoint = (serviceNumber) => `http://dn${serviceNumber}_web-server_1:${5000 + parseInt(serviceNumber) - 1}`
455
+
456
+ const _registerDiscProv = async (ethAccounts, serviceNumber) => {
457
+ const audiusLibs = await initAudiusLibs(true, null, ethAccounts[DISCOVERY_WALLET_OFFSET + serviceNumber])
458
+ const endpoint = makeDiscoveryProviderEndpoint(serviceNumber)
459
+ await registerLocalService(audiusLibs, discoveryNodeType, endpoint, amountOfAuds)
460
+ }
461
+
462
+ const makeCreatorNodeEndpoint = (serviceNumber) => `http://cn${serviceNumber}_creator-node_1:${4000 + parseInt(serviceNumber) - 1}`
463
+
464
+ // Templated cnode to allow for dynamic number of services
465
+ const _registerCnode = async (ethAccounts, serviceNumber) => {
466
+ const audiusLibs = await initAudiusLibs(true, null, ethAccounts[serviceNumber])
467
+ const endpoint = makeCreatorNodeEndpoint(serviceNumber)
468
+ await registerLocalService(audiusLibs, contentNodeType, endpoint, amountOfAuds)
469
+ }
470
+
471
+ const _deregisterCnode = async (ethAccounts, serviceNumber) => {
472
+ const audiusLibs = await initAudiusLibs(true, null, ethAccounts[serviceNumber])
473
+ const endpoint = makeCreatorNodeEndpoint(serviceNumber)
474
+ await deregisterLocalService(audiusLibs, contentNodeType, endpoint)
475
+ }
476
+
477
+ const _printEthContractAccounts = async (ethAccounts, numAccounts = 20) => {
478
+ const ganacheEthAccounts = await getEthContractAccounts()
479
+ const accts = []
480
+ for (let i = 0; i < numAccounts; i += 1) {
481
+ const addr = ethAccounts[i]
482
+ const privateKey = ganacheEthAccounts.private_keys[addr.toLowerCase()]
483
+ accts.push({
484
+ address: ethAccounts[i],
485
+ privateKey
486
+ })
487
+ }
488
+ console.log(JSON.stringify(accts))
489
+ }
490
+
491
+ // NOTE - newly selected wallet is the ethAccount with index 10 + current service number
492
+ const _updateCNodeDelegateOwnerWallet = async (ethAccounts, serviceNumber) => {
493
+ const audiusLibs = await initAudiusLibs(true, null, ethAccounts[serviceNumber])
494
+ const endpoint = makeCreatorNodeEndpoint(serviceNumber)
495
+ await updateServiceDelegateOwnerWallet(audiusLibs, contentNodeType, endpoint, ethAccounts[serviceNumber + 10])
496
+ }
497
+
498
+ const _updateCreatorNodeConfig = async (ownerWallet, templatePath, writePath, endpoint = null, isShell = false, delegateWallet) => {
499
+ delegateWallet = (delegateWallet || ownerWallet).toLowerCase()
500
+ ownerWallet = ownerWallet.toLowerCase()
501
+
502
+ const ganacheEthAccounts = await getEthContractAccounts()
503
+
504
+ // PKey is now recovered
505
+ const ownerWalletPrivKey = ganacheEthAccounts.private_keys[`${ownerWallet}`]
506
+ const delegateWalletPrivKey = ganacheEthAccounts.private_keys[`${delegateWallet}`]
507
+
508
+ await _updateCreatorNodeConfigFile(templatePath, writePath, ownerWallet, ownerWalletPrivKey, delegateWallet, delegateWalletPrivKey, endpoint, isShell)
509
+ }
510
+
511
+ const _deregisterAllSPs = async (audiusLibs, ethAccounts) => {
512
+ const audiusLibs1 = audiusLibs
513
+ await deregisterLocalService(audiusLibs1, discoveryNodeType, discProvEndpoint1)
514
+ const audiusLibs2 = await initAudiusLibs(true, null, ethAccounts[3])
515
+ await deregisterLocalService(audiusLibs2, discoveryNodeType, discProvEndpoint2)
516
+
517
+ const audiusLibs3 = await initAudiusLibs(true, null, ethAccounts[1])
518
+ await deregisterLocalService(audiusLibs3, contentNodeType, creatorNodeEndpoint1)
519
+ const audiusLibs4 = await initAudiusLibs(true, null, ethAccounts[2])
520
+ await deregisterLocalService(audiusLibs4, contentNodeType, creatorNodeEndpoint2)
521
+ const audiusLibs5 = await initAudiusLibs(true, null, ethAccounts[4])
522
+ await deregisterLocalService(audiusLibs5, contentNodeType, creatorNodeEndpoint3)
523
+ const audiusLibs6 = await initAudiusLibs(true, null, ethAccounts[5])
524
+ await deregisterLocalService(audiusLibs6, contentNodeType, creatorNodeEndpoint4)
525
+ }
526
+
527
+ const _initAllVersions = async (audiusLibs) => {
528
+ for (const serviceType of serviceTypesList) {
529
+ await setServiceVersion(audiusLibs, serviceType, serviceVersions[serviceType])
530
+ }
531
+ }
532
+
533
+ const _initEthContractTypes = async (libs) => {
534
+ console.log(`Registering additional service type ${contentNodeType} - Min=${contentNodeTypeMin}, Max=${contentNodeTypeMax}`)
535
+ // Add content-node serviceType
536
+ await addServiceType(libs, contentNodeType, contentNodeTypeMin, contentNodeTypeMax)
537
+ console.log(`Registering additional service type ${contentNodeType} - Min=${contentNodeTypeMin}, Max=${contentNodeTypeMax}`)
538
+ // Add discovery-node serviceType
539
+ await addServiceType(libs, discoveryNodeType, discoveryNodeTypeMin, discoveryNodeTypeMax)
540
+ }
541
+
542
+ const writeEnvConfigFromTemplate = async ({ templatePath, writePath, replaceMap }) => {
543
+ let template = fs.readFileSync(templatePath, 'utf8')
544
+ const progressReport = []
545
+ Object.entries(replaceMap).forEach(([toReplace, replacement]) => {
546
+ template = template.replace(`${toReplace}`, replacement)
547
+ progressReport.push(`${toReplace}: ${replacement}`)
548
+ })
549
+ fs.appendFileSync(writePath, template)
550
+ console.log(`Updated ${writePath}:\n${progressReport.join('\n')}`)
551
+ }
552
+
553
+ const _configureDiscProv = async (ethAccounts, serviceNumber, templatePath, writePath) => {
554
+ const ganacheEthAccounts = await getEthContractAccounts()
555
+ const discProvAccountPubkey = ethAccounts[DISCOVERY_WALLET_OFFSET + serviceNumber].toLowerCase()
556
+ const delegateWalletPrivKey = ganacheEthAccounts.private_keys[`${discProvAccountPubkey}`]
557
+ const replaceMap = {
558
+ AUDIUS_DELEGATE_OWNER_WALLET: discProvAccountPubkey,
559
+ AUDIUS_DELEGATE_PRIVATE_KEY: delegateWalletPrivKey
560
+ }
561
+ writeEnvConfigFromTemplate({ templatePath, writePath, replaceMap })
562
+ }
563
+
564
+ // Write an update to shell env file for creator nodes or docker env file
565
+ const _updateCreatorNodeConfigFile = async (templatePath, writePath, ownerWallet, ownerWalletPkey, delegateWallet, delegateWalletPrivKey, endpoint, isShell) => {
566
+ const replaceMap = {
567
+ DELEGATE_OWNER_WALLET: delegateWallet,
568
+ DELEGATE_PRIVATE_KEY: delegateWalletPrivKey,
569
+ CREATOR_NODE_ENDPOINT: endpoint,
570
+ SP_OWNER_WALLET: ownerWallet
571
+ }
572
+ writeEnvConfigFromTemplate({ templatePath, writePath, replaceMap })
573
+ }
574
+
575
+ const _updateUserReplicaSetManagerBootstrapConfig = async (ethAccounts) => {
576
+ const dataContractConfigPath = '../contracts/contract-config.js'
577
+ const fileStream = fs.createReadStream(dataContractConfigPath)
578
+ const rl = readline.createInterface({
579
+ input: fileStream,
580
+ crlfDelay: Infinity
581
+ })
582
+ const bootstrapSPIds = [1, 2, 3]
583
+ const bootstrapSPDelegateWallets = bootstrapSPIds.map((id) => {
584
+ return ethAccounts[id]
585
+ })
586
+ const bootstrapSPOwnerWallets = bootstrapSPDelegateWallets
587
+ const bootstrapSPIdsString = ` bootstrapSPIds: [${bootstrapSPIds}],`
588
+ const bootstrapSPDelegateWalletsString = ` bootstrapSPDelegateWallets: ['${bootstrapSPDelegateWallets[0]}', '${bootstrapSPDelegateWallets[1]}', '${bootstrapSPDelegateWallets[2]}'],`
589
+ const bootstrapSPOwnerWalletString = ` bootstrapSPOwnerWallets: ['${bootstrapSPOwnerWallets[0]}', '${bootstrapSPOwnerWallets[1]}', '${bootstrapSPDelegateWallets[2]}'],`
590
+ const bootstrapRegistryAddressString = ` registryAddress: '${dataContractsConfig.registryAddress}'`
591
+ console.log('Initializing UserReplicaSetManager configuration from known delegateWallets within system...')
592
+ console.log(`Bootstrapping with ${bootstrapSPIds}, ${bootstrapSPDelegateWallets}, ${bootstrapSPOwnerWalletString}`)
593
+
594
+ let traversingDevelopmentConfigBlock = false
595
+ const output = []
596
+ for await (const line of rl) {
597
+ if (line.includes('development')) {
598
+ traversingDevelopmentConfigBlock = true
599
+ output.push(line)
600
+ } else if (line.includes('test_local')) {
601
+ traversingDevelopmentConfigBlock = false
602
+ output.push(line)
603
+ } else if (traversingDevelopmentConfigBlock && line.includes('bootstrapSPIds')) {
604
+ output.push(bootstrapSPIdsString)
605
+ } else if (traversingDevelopmentConfigBlock && line.includes('bootstrapSPDelegateWallets')) {
606
+ output.push(bootstrapSPDelegateWalletsString)
607
+ } else if (traversingDevelopmentConfigBlock && line.includes('bootstrapSPOwnerWallets')) {
608
+ output.push(bootstrapSPOwnerWalletString)
609
+ } else if (traversingDevelopmentConfigBlock && line.includes('registryAddress')) {
610
+ output.push(bootstrapRegistryAddressString)
611
+ } else {
612
+ output.push(line)
613
+ }
614
+ }
615
+ fs.writeFileSync(dataContractConfigPath, output.join('\n'))
616
+ console.log(`Updated ${dataContractConfigPath} with \nbootstrapSPIds=${bootstrapSPIds}\nbootstrapSPDelegateWallets=${bootstrapSPDelegateWallets}\nbootstrapSPOwnerWallets:${bootstrapSPOwnerWallets}`)
617
+ }