├── .github └── pull_request_template.md ├── .gitignore ├── ADVANCED_SETUP.md ├── LICENSE ├── README.md ├── audius-cli ├── common-services.yml ├── creator-node ├── dev.env ├── docker-compose.yml ├── prod.env └── stage.env ├── discovery-provider ├── Caddyfile ├── chain │ ├── NLog.config │ ├── config.cfg │ ├── dev_spec_template.json │ ├── prod_spec_template.json │ └── stage_spec_template.json ├── dev.env ├── docker-compose.yml ├── prod.env ├── seed.sh └── stage.env ├── eth-contracts └── ABIs │ ├── Registry.json │ └── ServiceTypeManager.json ├── identity-service ├── dev.env ├── docker-compose.yml ├── prod.env └── stage.env ├── install.sh ├── ops ├── README.md └── docker-compose-pgonly.yml ├── requirements.txt ├── setup.sh ├── test.txt └── utilities ├── .nvmrc ├── README.md ├── claim ├── ERC20Splitter.json ├── EthRewardsManager.json ├── README.md └── claim.js ├── creator-node ├── apiSigning.js ├── delistContent │ ├── hashIds.js │ └── index.js └── healthChecks.js ├── discovery-provider └── healthChecks.js ├── package-lock.json └── package.json /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | override.env 2 | blockscout.env 3 | audius-cli.log 4 | auto-upgrade.log 5 | 6 | # .env files for system (tag, env management) 7 | discovery-provider/.env 8 | creator-node/.env 9 | identity-service/.env 10 | ddex/.env 11 | 12 | # discovery blockchain 13 | discovery-provider/chain/spec.json 14 | discovery-provider/chain/static-nodes.json 15 | 16 | # ddex 17 | ddex/mongo-keyfile 18 | 19 | # old utilities 20 | sp-utilities/node_modules/* 21 | utilities/node_modules/* 22 | utilities/claim/wormholeTransactions.txt 23 | 24 | ddex/data 25 | -------------------------------------------------------------------------------- /ADVANCED_SETUP.md: -------------------------------------------------------------------------------- 1 | # Advanced Setup 2 | 3 | ## Table of Contents 4 | - [Launching a new node from scratch](#launching-a-new-node-from-scratch) 5 | - [Setting environment variables](#setting-environment-variables) 6 | - [Creator Node](#creator-node) 7 | - [Discovery Provider](#discovery-provider) 8 | - [Launch](#launch) 9 | - [Migration from Kubernetes](#migration-from-kubernetes) 10 | ## Launching a new node from scratch 11 | 12 | ### Setting environment variables 13 | 14 | ```sh 15 | # to set individual environment variables 16 | # valid service-names are "creator-node" or "discovery-provider" 17 | audius-cli set-config creator-node 18 | audius-cli set-config discovery-provider 19 | 20 | # to set all the required environment variables for a service, use the --required flag 21 | audius-cli set-config --required creator-node 22 | audius-cli set-config --required discovery-provider 23 | ``` 24 | 25 | #### Creator Node 26 | There are four required creator node environment variables, available in the creator node section [here](README.md#creator-node). 27 | 28 | The full list of variables and explanations can be found on the wiki [here](https://github.com/AudiusProject/audius-protocol/wiki/Content-Node:-Configuration-Details#required-environment-variables). Generally node operators will not need to modify any other environment variables 29 | 30 | #### Discovery Provider 31 | There are two required discovery provider environment variables, available in the discovery provider section [here](README.md#discovery-provider). 32 | 33 | The full list of variables and explanations can be found on the wiki [here](https://github.com/AudiusProject/audius-protocol/wiki/Discovery-Node:-Configuration-Details#required-environment-variables). Generally node operators will not need to modify any other environment variables 34 | 35 | ### Launch 36 | ```sh 37 | audius-cli launch creator-node 38 | 39 | # or 40 | 41 | audius-cli launch discovery-provider (--seed) 42 | 43 | # Options: 44 | # --seed 45 | # Seeds the database from a snapshot. Required for first-time discovery setup. 46 | ``` 47 | 48 | ## Migration from Kubernetes 49 | 50 | ```sh 51 | # Clone and install related dependencies 52 | git clone https://github.com/AudiusProject/audius-docker-compose.git ~/audius-docker-compose 53 | bash ~/audius-docker-compose/setup.sh 54 | 55 | # Get configs from k8s-manifests and set them again via set-config 56 | cat ~/audius-k8s-manifests/config.yaml 57 | audius-cli set-config 58 | 59 | # Remember to configure firewalls and load balancers to allow the service port through 60 | 61 | # Turn off Postgres on the host. If this command returns an error it's not a problem. 62 | sudo systemctl stop postgresql.service 63 | 64 | # Remove kube 65 | audius-cli auto-upgrade --remove 66 | kubectl delete --all-namespaces --all deployments 67 | kubectl delete --all-namespaces --all pods 68 | sudo kubeadm reset 69 | 70 | # Launch the service 71 | audius-cli launch 72 | ``` 73 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [2025] [Open Audio Foundation] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 | 4 | audius-client 5 | 6 |
7 | 8 | 9 |

10 | audius-cli 11 |
12 | 🚀 🎧 🐳 13 |
14 | Launch and manage Audius services using Docker Compose 15 |

16 |

17 | 18 | > Hardware [requirements](https://docs.audius.org/token/running-a-node/hardware-requirements) 19 | 20 | 21 | ## Installation 22 | 23 | On a VM that meets the minimum requirements from above run: 24 | 25 | ```sh 26 | bash <(curl https://raw.githubusercontent.com/AudiusProject/audius-docker-compose/main/install.sh) 27 | ``` 28 | 29 | During installation there will be prompts for required environment variables. 30 | After setting the variables, they are exported to an `override.env` file in the respective service directory. 31 | 32 | ### Content Node (Creator Node) 33 | 34 | | Variable | Description | Example | 35 | | ----------- | ----------- | ----------- | 36 | | creatorNodeEndpoint | The DNS of your content node. If you haven't registered the service yet, please enter the url you plan to register | https://cn1.operator.xyz | 37 | | delegateOwnerWallet | Public key for the service used to sign responses from the server. This wallet holds no tokens. | `0x07bC80Cc29bb15a5CA3D9DB9D80AcA25eB967aFc` | 38 | | delegatePrivateKey | Private key associated with `delegateOwnerWallet` | `2ef5a28ab4c39199085eb4707d292c980fef3dcc9dc854ba8736a545c11e81c4` | 39 | | spOwnerWallet | Public key that registered (or will register) the content node on chain. This wallet holds tokens. | `0x92d3ff660158Ec716f1bA28Bc65a7a0744E26A98` | 40 | 41 | 42 | ### Discovery Node (Discovery Provider) 43 | 44 | | Variable | Description | Example | 45 | | ----------- | ----------- | ----------- | 46 | | audius_discprov_url | The DNS of the discovery node. If you haven't registered the service yet, please enter the url you plan to register | https://dn1.operator.xyz | 47 | | audius_delegate_owner_wallet | Public key for the service used to sign responses from the server. This wallet holds no tokens. | `0x07bC80Cc29bb15a5CA3D9DB9D80AcA25eB967aFc` | 48 | | audius_delegate_private_key | Private key associated with `audius_delegate_owner_wallet` | `2ef5a28ab4c39199085eb4707d292c980fef3dcc9dc854ba8736a545c11e81c4` | 49 | 50 |
51 | 52 | ### Customizing override.env 53 | If you would like to maintain environment variables externally to the repository, you can use the following commands to override the path for the `override.env` file 54 | 55 | ``` 56 | audius-cli set-override-path discovery-provider 57 | audius-cli set-override-path discovery-provider --unset 58 | ``` 59 | 60 | ## Upgrading 61 | You can upgrade your service to the latest release by setting up autoupgrade: 62 | ``` 63 | audius-cli auto-upgrade 64 | ``` 65 | 66 | Or manually: 67 | ``` 68 | audius-cli upgrade 69 | ``` 70 | 71 | ## Logging 72 | Logging is enabled by _default_ to stream logs to an external logging service for debugging purposes. It is *strongly* recommended to keep logging enabled. The Audius logging stack uses [vector.dev](vector.dev) to ship container logs. 73 | 74 | If there's a reason to turn logging off, it can be disabled via config: 75 | ``` 76 | audius-cli set-config discovery-provider audius_logging_disabled true 77 | audius-cli launch discovery-provider 78 | ``` 79 | 80 | ## SSL configuration 81 | 82 | [Caddy](https://caddyserver.com/) will automatically obtain certs from Let's Encrypt provided the following is true: 83 | 84 | * DNS points to your machine 85 | * The `audius_discprov_url` or `creatorNodeEndpoint` matches the DNS name. (e.g. `https://discovery2.myhost.com`... **no trailing slash!**) 86 | * Ports 80 and 443 are open to the internet 87 | 88 | If SSL is not working after a minute, `docker logs caddy` can provide clues. 89 | 90 | ### SSL with CloudFlare Proxy 91 | 92 | If you are using CloudFlare Proxy, configure Caddy to generate a self-signed cert instead of using Let's Encrypt. 93 | 94 | For Creator Node: 95 | 96 | ``` 97 | audius-cli set-config creator-node CADDY_TLS 'tls internal' 98 | audius-cli launch creator-node 99 | ``` 100 | 101 | For Discovery Provider: 102 | 103 | ``` 104 | audius-cli set-config discovery-provider CADDY_TLS 'tls internal' 105 | audius-cli launch discovery-provider 106 | ``` 107 | 108 | For DDEX: 109 | 110 | ``` 111 | audius-cli set-config ddex CADDY_TLS 'tls internal' 112 | audius-cli launch ddex 113 | ``` 114 | 115 | ## Utilities 116 | The [utilities folder](/utilities/) contains a set of scripts and utilities to manage services like: 117 | - Running pre-registration health checks 118 | - Automatic rewards claim script 119 | 120 | ## Advanced options 121 | For more advanced configuration options or migrating from Kubernetes check out the [Advanced Setup Guide](ADVANCED_SETUP.md) 122 | 123 | 124 | ## DDEX setup (advanced) 125 | Audius provides the option to self-host your own [Digital Data Exchange (DDEX)](https://kb.ddex.net) implementation. To run one of the existing implementations on your own infrastructure: 126 | 127 | 1. Follow the regular instructions above to run install.sh, and choose "ddex" as the service to install. 128 | 2. Edit ddex/override.env to have a value for each environment variable 129 | - See [here](https://github.com/AudiusProject/audius-protocol/tree/main/packages/ddex#readme) for instructions on how to setup your S3 buckets, as well as the environment variable options 130 | 3. `audius-cli launch ddex` 131 | 4. Enable auto-upgrade: `audius-cli auto-upgrade "* * * * *"` 132 | 5. Make sure you've set the `DDEX_URL` environment variable to the URL that will host this server, and see "SSL Configuration" above for SSL setup 133 | -------------------------------------------------------------------------------- /common-services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | base-postgres: 3 | image: postgres:11.22-bookworm 4 | shm_size: 2g 5 | restart: always 6 | command: postgres -c shared_buffers=2GB -c max_connections=500 -c shared_preload_libraries=pg_stat_statements 7 | healthcheck: 8 | test: ['CMD', 'pg_isready', '-U', 'postgres'] 9 | interval: 10s 10 | timeout: 5s 11 | ports: 12 | - '127.0.0.1:5432:5432' 13 | environment: 14 | POSTGRES_USER: postgres 15 | POSTGRES_PASSWORD: postgres 16 | logging: 17 | options: 18 | max-size: 10m 19 | max-file: 3 20 | mode: non-blocking 21 | max-buffer-size: 100m 22 | driver: json-file 23 | 24 | base-redis: 25 | image: redis:7.0 26 | command: redis-server --save 60 1 27 | restart: always 28 | healthcheck: 29 | test: ['CMD', 'redis-cli', 'PING'] 30 | interval: 10s 31 | timeout: 5s 32 | logging: 33 | options: 34 | max-size: 10m 35 | max-file: 3 36 | mode: non-blocking 37 | max-buffer-size: 100m 38 | driver: json-file 39 | volumes: 40 | - /var/redis_data:/data 41 | 42 | vector: 43 | image: audius/vector:0.39.0-alpine 44 | container_name: vector 45 | restart: always 46 | volumes: 47 | - /var/run/docker.sock:/var/run/docker.sock 48 | logging: 49 | options: 50 | max-size: 10m 51 | max-file: 3 52 | mode: non-blocking 53 | max-buffer-size: 100m 54 | driver: json-file 55 | -------------------------------------------------------------------------------- /creator-node/dev.env: -------------------------------------------------------------------------------- 1 | # Dummy env file, must exist because the docker-compose.yml file's 'env_file' setting for vector 2 | -------------------------------------------------------------------------------- /creator-node/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | # used by audius-d devnet 4 | x-extra-hosts: &extra-hosts 5 | extra_hosts: 6 | - "creator-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 7 | - "discovery-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 8 | - "identity.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 9 | - "eth-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 10 | - "acdc-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 11 | - "solana-test-validator.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 12 | 13 | services: 14 | audiusd: 15 | image: audius/audiusd:${TAG:-current} 16 | container_name: audiusd 17 | pull_policy: always 18 | <<: *extra-hosts 19 | restart: unless-stopped 20 | networks: 21 | - creator-node-network 22 | ports: 23 | - '1991:1991' # mediorum http server 24 | - '127.0.0.1:6060:6060' # mediorum pprof server 25 | - '26656:26656' # cometBFT P2P server 26 | - '26657:26657' # cometBFT RPC server 27 | - '26659:26659' # console UI 28 | - '50051:50051' # core GRPC server 29 | - '127.0.0.1:5432:5432' # postgresql 30 | - "${AUDIUSD_HTTP_PORT:-80}:80" # echoserver http required for auto tls 31 | - "${AUDIUSD_HTTPS_PORT:-443}:443" # echoserver https via letsencrypt 32 | env_file: 33 | - ${OVERRIDE_PATH:-override.env} 34 | environment: 35 | - LOGSPOUT=ignore 36 | - AUDIUSD_STORAGE_ENABLED=true 37 | - audius_core_root_dir=/audius-core 38 | logging: 39 | options: 40 | max-size: 10m 41 | max-file: 3 42 | mode: non-blocking 43 | max-buffer-size: 100m 44 | driver: json-file 45 | volumes: 46 | - /var/k8s/bolt:/bolt 47 | - /var/k8s/bolt:/audius-core 48 | - /var/k8s/mediorum:/tmp/mediorum 49 | - /var/k8s/creator-node-db-15:/data/postgres 50 | deploy: 51 | resources: 52 | limits: 53 | cpus: '6.0' 54 | memory: '14G' 55 | 56 | vector: 57 | extends: 58 | file: ../common-services.yml 59 | service: vector 60 | env_file: 61 | - ${NETWORK:-prod}.env 62 | networks: 63 | - creator-node-network 64 | 65 | networks: 66 | creator-node-network: 67 | -------------------------------------------------------------------------------- /creator-node/prod.env: -------------------------------------------------------------------------------- 1 | audius_axiom_dataset=content 2 | -------------------------------------------------------------------------------- /creator-node/stage.env: -------------------------------------------------------------------------------- 1 | audius_axiom_dataset=stage-content 2 | -------------------------------------------------------------------------------- /discovery-provider/Caddyfile: -------------------------------------------------------------------------------- 1 | # Handle domain name with HTTPS 2 | {$audius_discprov_url} { 3 | {$CADDY_TLS} 4 | 5 | encode zstd gzip 6 | 7 | @comms { 8 | path /comms* 9 | expression "{$NO_COMMS}" == "" 10 | } 11 | reverse_proxy @comms comms:8925 12 | 13 | # defaults to openresty:5000 14 | header X-Forwarded-Proto {scheme} 15 | reverse_proxy {$ROOT_HOST:"openresty:5000"} 16 | } 17 | 18 | # Add a second HTTPS domain for unproxied requests 19 | {$audius_discprov_url_unproxied:unused.localhost} { 20 | encode zstd gzip 21 | 22 | @comms { 23 | path /comms* 24 | expression "{$NO_COMMS}" == "" 25 | } 26 | reverse_proxy @comms comms:8925 27 | 28 | # defaults to openresty:5000 29 | header X-Forwarded-Proto {scheme} 30 | reverse_proxy {$ROOT_HOST:"openresty:5000"} 31 | } 32 | 33 | # Handle IP address with HTTP - explicitly bind to all interfaces 34 | :80 { 35 | encode zstd gzip 36 | 37 | @comms { 38 | path /comms* 39 | expression "{$NO_COMMS}" == "" 40 | } 41 | reverse_proxy @comms comms:8925 42 | 43 | # defaults to openresty:5000 44 | header X-Forwarded-Proto {scheme} 45 | reverse_proxy {$ROOT_HOST:"openresty:5000"} 46 | } 47 | -------------------------------------------------------------------------------- /discovery-provider/chain/NLog.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 21 | 22 | 23 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /discovery-provider/chain/config.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "Init": { 3 | "WebSocketsEnabled": false, 4 | "StoreReceipts" : true, 5 | "EnableUnsecuredDevWallet": true, 6 | "IsMining": true, 7 | "ChainSpecPath": "/config/spec.json", 8 | "BaseDbPath": "nethermind_db/clique", 9 | "LogFileName": "clique.logs.txt", 10 | "StaticNodesPath": "Data/static-nodes.json" 11 | }, 12 | "Network": { 13 | "DiscoveryPort": 30300, 14 | "P2PPort": 30300, 15 | "MaxActivePeers": 100 16 | }, 17 | "HealthChecks": { 18 | "Enabled": true, 19 | "MaxIntervalWithoutProcessedBlock": 15, 20 | }, 21 | "JsonRpc": { 22 | "Enabled": true, 23 | "EnabledModules": [ 24 | "Admin", 25 | "Eth", 26 | "Subscribe", 27 | "Trace", 28 | "TxPool", 29 | "Web3", 30 | "Personal", 31 | "Proof", 32 | "Net", 33 | "Parity", 34 | "Health", 35 | "Rpc", 36 | "Clique" 37 | ], 38 | "Host": "0.0.0.0", 39 | "Port": 8545, 40 | }, 41 | "Mining": { 42 | "MinGasPrice": 0 43 | } 44 | } -------------------------------------------------------------------------------- /discovery-provider/chain/dev_spec_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "audius", 3 | "dataDir": "audius", 4 | "engine": { 5 | "clique": { 6 | "params": { 7 | "period": 1, 8 | "epoch": 30000 9 | } 10 | } 11 | }, 12 | "params": { 13 | "accountStartNonce": "0x0", 14 | "eip98Transition": "0xffffffffffffffff", 15 | "eip140Transition": "0x0", 16 | "eip145Transition": "0x0", 17 | "eip150Transition": "0x0", 18 | "eip155Transition": "0x0", 19 | "eip158Transition": "0x0", 20 | "eip160Transition": "0x0", 21 | "eip161abcTransition": "0x0", 22 | "eip161dTransition": "0x0", 23 | "eip211Transition": "0x0", 24 | "eip214Transition": "0x0", 25 | "eip658Transition": "0x0", 26 | "eip1014Transition": "0x0", 27 | "eip1052Transition": "0x0", 28 | "eip1283Transition": "0x0", 29 | "gasLimitBoundDivisor": "0x400", 30 | "homesteadTransition": "0x0", 31 | "kip4Transition": "0xffffffffffffffff", 32 | "kip6Transition": "0xffffffffffffffff", 33 | "maxCodeSize": "0x6000", 34 | "maxCodeSizeTransition": "0x0", 35 | "maximumExtraDataSize": "0x320", 36 | "minGasLimit": "0x1388", 37 | "networkID": "0x87A3F5", 38 | "validateReceipts": false, 39 | "validateReceiptsTransition": "0xffffffffffffffff", 40 | "wasmActivationTransition": "0xffffffffffffffff" 41 | }, 42 | "genesis": { 43 | "seal": { 44 | "ethereum": { 45 | "nonce": "0x0000000000000000", 46 | "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" 47 | } 48 | }, 49 | "author": "0x0000000000000000000000000000000000000000", 50 | "difficulty": "0x1", 51 | "extraData": "", 52 | "gasLimit": "0xa00000", 53 | "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 54 | "timestamp": "0x5bdda800" 55 | }, 56 | "nodes": [], 57 | "accounts": { 58 | "0x0000000000000000000000000000000000000000": { 59 | "balance": "0x1" 60 | }, 61 | "0x0000000000000000000000000000000000000001": { 62 | "balance": "0x1", 63 | "builtin": { 64 | "name": "ecrecover", 65 | "pricing": { 66 | "linear": { 67 | "base": 3000, 68 | "word": 0 69 | } 70 | } 71 | } 72 | }, 73 | "0x0000000000000000000000000000000000000002": { 74 | "balance": "0x1", 75 | "builtin": { 76 | "name": "sha256", 77 | "pricing": { 78 | "linear": { 79 | "base": 60, 80 | "word": 12 81 | } 82 | } 83 | } 84 | }, 85 | "0x0000000000000000000000000000000000000003": { 86 | "balance": "0x1", 87 | "builtin": { 88 | "name": "ripemd160", 89 | "pricing": { 90 | "linear": { 91 | "base": 600, 92 | "word": 120 93 | } 94 | } 95 | } 96 | }, 97 | "0x0000000000000000000000000000000000000004": { 98 | "balance": "0x1", 99 | "builtin": { 100 | "name": "identity", 101 | "pricing": { 102 | "linear": { 103 | "base": 15, 104 | "word": 3 105 | } 106 | } 107 | } 108 | }, 109 | "0x0000000000000000000000000000000000000005": { 110 | "balance": "0x1", 111 | "builtin": { 112 | "name": "modexp", 113 | "activate_at": "0x0", 114 | "pricing": { 115 | "modexp": { 116 | "divisor": 20 117 | } 118 | } 119 | } 120 | }, 121 | "0x0000000000000000000000000000000000000006": { 122 | "balance": "0x1", 123 | "builtin": { 124 | "name": "alt_bn128_add", 125 | "activate_at": "0x0", 126 | "pricing": { 127 | "linear": { 128 | "base": 500, 129 | "word": 0 130 | } 131 | } 132 | } 133 | }, 134 | "0x0000000000000000000000000000000000000007": { 135 | "balance": "0x1", 136 | "builtin": { 137 | "name": "alt_bn128_mul", 138 | "activate_at": "0x0", 139 | "pricing": { 140 | "linear": { 141 | "base": 40000, 142 | "word": 0 143 | } 144 | } 145 | } 146 | }, 147 | "0x0000000000000000000000000000000000000008": { 148 | "balance": "0x1", 149 | "builtin": { 150 | "name": "alt_bn128_pairing", 151 | "activate_at": "0x0", 152 | "pricing": { 153 | "alt_bn128_pairing": { 154 | "base": 100000, 155 | "pair": 80000 156 | } 157 | } 158 | } 159 | }, 160 | "0x0000000000000000000000000000000000000009": { 161 | "balance": "0x1" 162 | }, 163 | "0x000000000000000000000000000000000000000a": { 164 | "balance": "0x1" 165 | }, 166 | "0x000000000000000000000000000000000000000b": { 167 | "balance": "0x1" 168 | }, 169 | "0x000000000000000000000000000000000000000c": { 170 | "balance": "0x1" 171 | }, 172 | "0x000000000000000000000000000000000000000d": { 173 | "balance": "0x1" 174 | }, 175 | "0x000000000000000000000000000000000000000e": { 176 | "balance": "0x1" 177 | }, 178 | "0x000000000000000000000000000000000000000f": { 179 | "balance": "0x1" 180 | }, 181 | "0x0000000000000000000000000000000000000010": { 182 | "balance": "0x1" 183 | }, 184 | "0x0000000000000000000000000000000000000011": { 185 | "balance": "0x1" 186 | }, 187 | "0x0000000000000000000000000000000000000012": { 188 | "balance": "0x1" 189 | }, 190 | "0x0000000000000000000000000000000000000013": { 191 | "balance": "0x1" 192 | }, 193 | "0x0000000000000000000000000000000000000014": { 194 | "balance": "0x1" 195 | }, 196 | "0x0000000000000000000000000000000000000015": { 197 | "balance": "0x1" 198 | }, 199 | "0x0000000000000000000000000000000000000016": { 200 | "balance": "0x1" 201 | }, 202 | "0x0000000000000000000000000000000000000017": { 203 | "balance": "0x1" 204 | }, 205 | "0x0000000000000000000000000000000000000018": { 206 | "balance": "0x1" 207 | }, 208 | "0x0000000000000000000000000000000000000019": { 209 | "balance": "0x1" 210 | }, 211 | "0x000000000000000000000000000000000000001a": { 212 | "balance": "0x1" 213 | }, 214 | "0x000000000000000000000000000000000000001b": { 215 | "balance": "0x1" 216 | }, 217 | "0x000000000000000000000000000000000000001c": { 218 | "balance": "0x1" 219 | }, 220 | "0x000000000000000000000000000000000000001d": { 221 | "balance": "0x1" 222 | }, 223 | "0x000000000000000000000000000000000000001e": { 224 | "balance": "0x1" 225 | }, 226 | "0x000000000000000000000000000000000000001f": { 227 | "balance": "0x1" 228 | }, 229 | "0x0000000000000000000000000000000000000020": { 230 | "balance": "0x1" 231 | }, 232 | "0x0000000000000000000000000000000000000021": { 233 | "balance": "0x1" 234 | }, 235 | "0x0000000000000000000000000000000000000022": { 236 | "balance": "0x1" 237 | }, 238 | "0x0000000000000000000000000000000000000023": { 239 | "balance": "0x1" 240 | }, 241 | "0x0000000000000000000000000000000000000024": { 242 | "balance": "0x1" 243 | }, 244 | "0x0000000000000000000000000000000000000025": { 245 | "balance": "0x1" 246 | }, 247 | "0x0000000000000000000000000000000000000026": { 248 | "balance": "0x1" 249 | }, 250 | "0x0000000000000000000000000000000000000027": { 251 | "balance": "0x1" 252 | }, 253 | "0x0000000000000000000000000000000000000028": { 254 | "balance": "0x1" 255 | }, 256 | "0x0000000000000000000000000000000000000029": { 257 | "balance": "0x1" 258 | }, 259 | "0x000000000000000000000000000000000000002a": { 260 | "balance": "0x1" 261 | }, 262 | "0x000000000000000000000000000000000000002b": { 263 | "balance": "0x1" 264 | }, 265 | "0x000000000000000000000000000000000000002c": { 266 | "balance": "0x1" 267 | }, 268 | "0x000000000000000000000000000000000000002d": { 269 | "balance": "0x1" 270 | }, 271 | "0x000000000000000000000000000000000000002e": { 272 | "balance": "0x1" 273 | }, 274 | "0x000000000000000000000000000000000000002f": { 275 | "balance": "0x1" 276 | }, 277 | "0x0000000000000000000000000000000000000030": { 278 | "balance": "0x1" 279 | }, 280 | "0x0000000000000000000000000000000000000031": { 281 | "balance": "0x1" 282 | }, 283 | "0x0000000000000000000000000000000000000032": { 284 | "balance": "0x1" 285 | }, 286 | "0x0000000000000000000000000000000000000033": { 287 | "balance": "0x1" 288 | }, 289 | "0x0000000000000000000000000000000000000034": { 290 | "balance": "0x1" 291 | }, 292 | "0x0000000000000000000000000000000000000035": { 293 | "balance": "0x1" 294 | }, 295 | "0x0000000000000000000000000000000000000036": { 296 | "balance": "0x1" 297 | }, 298 | "0x0000000000000000000000000000000000000037": { 299 | "balance": "0x1" 300 | }, 301 | "0x0000000000000000000000000000000000000038": { 302 | "balance": "0x1" 303 | }, 304 | "0x0000000000000000000000000000000000000039": { 305 | "balance": "0x1" 306 | }, 307 | "0x000000000000000000000000000000000000003a": { 308 | "balance": "0x1" 309 | }, 310 | "0x000000000000000000000000000000000000003b": { 311 | "balance": "0x1" 312 | }, 313 | "0x000000000000000000000000000000000000003c": { 314 | "balance": "0x1" 315 | }, 316 | "0x000000000000000000000000000000000000003d": { 317 | "balance": "0x1" 318 | }, 319 | "0x000000000000000000000000000000000000003e": { 320 | "balance": "0x1" 321 | }, 322 | "0x000000000000000000000000000000000000003f": { 323 | "balance": "0x1" 324 | }, 325 | "0x0000000000000000000000000000000000000040": { 326 | "balance": "0x1" 327 | }, 328 | "0x0000000000000000000000000000000000000041": { 329 | "balance": "0x1" 330 | }, 331 | "0x0000000000000000000000000000000000000042": { 332 | "balance": "0x1" 333 | }, 334 | "0x0000000000000000000000000000000000000043": { 335 | "balance": "0x1" 336 | }, 337 | "0x0000000000000000000000000000000000000044": { 338 | "balance": "0x1" 339 | }, 340 | "0x0000000000000000000000000000000000000045": { 341 | "balance": "0x1" 342 | }, 343 | "0x0000000000000000000000000000000000000046": { 344 | "balance": "0x1" 345 | }, 346 | "0x0000000000000000000000000000000000000047": { 347 | "balance": "0x1" 348 | }, 349 | "0x0000000000000000000000000000000000000048": { 350 | "balance": "0x1" 351 | }, 352 | "0x0000000000000000000000000000000000000049": { 353 | "balance": "0x1" 354 | }, 355 | "0x000000000000000000000000000000000000004a": { 356 | "balance": "0x1" 357 | }, 358 | "0x000000000000000000000000000000000000004b": { 359 | "balance": "0x1" 360 | }, 361 | "0x000000000000000000000000000000000000004c": { 362 | "balance": "0x1" 363 | }, 364 | "0x000000000000000000000000000000000000004d": { 365 | "balance": "0x1" 366 | }, 367 | "0x000000000000000000000000000000000000004e": { 368 | "balance": "0x1" 369 | }, 370 | "0x000000000000000000000000000000000000004f": { 371 | "balance": "0x1" 372 | }, 373 | "0x0000000000000000000000000000000000000050": { 374 | "balance": "0x1" 375 | }, 376 | "0x0000000000000000000000000000000000000051": { 377 | "balance": "0x1" 378 | }, 379 | "0x0000000000000000000000000000000000000052": { 380 | "balance": "0x1" 381 | }, 382 | "0x0000000000000000000000000000000000000053": { 383 | "balance": "0x1" 384 | }, 385 | "0x0000000000000000000000000000000000000054": { 386 | "balance": "0x1" 387 | }, 388 | "0x0000000000000000000000000000000000000055": { 389 | "balance": "0x1" 390 | }, 391 | "0x0000000000000000000000000000000000000056": { 392 | "balance": "0x1" 393 | }, 394 | "0x0000000000000000000000000000000000000057": { 395 | "balance": "0x1" 396 | }, 397 | "0x0000000000000000000000000000000000000058": { 398 | "balance": "0x1" 399 | }, 400 | "0x0000000000000000000000000000000000000059": { 401 | "balance": "0x1" 402 | }, 403 | "0x000000000000000000000000000000000000005a": { 404 | "balance": "0x1" 405 | }, 406 | "0x000000000000000000000000000000000000005b": { 407 | "balance": "0x1" 408 | }, 409 | "0x000000000000000000000000000000000000005c": { 410 | "balance": "0x1" 411 | }, 412 | "0x000000000000000000000000000000000000005d": { 413 | "balance": "0x1" 414 | }, 415 | "0x000000000000000000000000000000000000005e": { 416 | "balance": "0x1" 417 | }, 418 | "0x000000000000000000000000000000000000005f": { 419 | "balance": "0x1" 420 | }, 421 | "0x0000000000000000000000000000000000000060": { 422 | "balance": "0x1" 423 | }, 424 | "0x0000000000000000000000000000000000000061": { 425 | "balance": "0x1" 426 | }, 427 | "0x0000000000000000000000000000000000000062": { 428 | "balance": "0x1" 429 | }, 430 | "0x0000000000000000000000000000000000000063": { 431 | "balance": "0x1" 432 | }, 433 | "0x0000000000000000000000000000000000000064": { 434 | "balance": "0x1" 435 | }, 436 | "0x0000000000000000000000000000000000000065": { 437 | "balance": "0x1" 438 | }, 439 | "0x0000000000000000000000000000000000000066": { 440 | "balance": "0x1" 441 | }, 442 | "0x0000000000000000000000000000000000000067": { 443 | "balance": "0x1" 444 | }, 445 | "0x0000000000000000000000000000000000000068": { 446 | "balance": "0x1" 447 | }, 448 | "0x0000000000000000000000000000000000000069": { 449 | "balance": "0x1" 450 | }, 451 | "0x000000000000000000000000000000000000006a": { 452 | "balance": "0x1" 453 | }, 454 | "0x000000000000000000000000000000000000006b": { 455 | "balance": "0x1" 456 | }, 457 | "0x000000000000000000000000000000000000006c": { 458 | "balance": "0x1" 459 | }, 460 | "0x000000000000000000000000000000000000006d": { 461 | "balance": "0x1" 462 | }, 463 | "0x000000000000000000000000000000000000006e": { 464 | "balance": "0x1" 465 | }, 466 | "0x000000000000000000000000000000000000006f": { 467 | "balance": "0x1" 468 | }, 469 | "0x0000000000000000000000000000000000000070": { 470 | "balance": "0x1" 471 | }, 472 | "0x0000000000000000000000000000000000000071": { 473 | "balance": "0x1" 474 | }, 475 | "0x0000000000000000000000000000000000000072": { 476 | "balance": "0x1" 477 | }, 478 | "0x0000000000000000000000000000000000000073": { 479 | "balance": "0x1" 480 | }, 481 | "0x0000000000000000000000000000000000000074": { 482 | "balance": "0x1" 483 | }, 484 | "0x0000000000000000000000000000000000000075": { 485 | "balance": "0x1" 486 | }, 487 | "0x0000000000000000000000000000000000000076": { 488 | "balance": "0x1" 489 | }, 490 | "0x0000000000000000000000000000000000000077": { 491 | "balance": "0x1" 492 | }, 493 | "0x0000000000000000000000000000000000000078": { 494 | "balance": "0x1" 495 | }, 496 | "0x0000000000000000000000000000000000000079": { 497 | "balance": "0x1" 498 | }, 499 | "0x000000000000000000000000000000000000007a": { 500 | "balance": "0x1" 501 | }, 502 | "0x000000000000000000000000000000000000007b": { 503 | "balance": "0x1" 504 | }, 505 | "0x000000000000000000000000000000000000007c": { 506 | "balance": "0x1" 507 | }, 508 | "0x000000000000000000000000000000000000007d": { 509 | "balance": "0x1" 510 | }, 511 | "0x000000000000000000000000000000000000007e": { 512 | "balance": "0x1" 513 | }, 514 | "0x000000000000000000000000000000000000007f": { 515 | "balance": "0x1" 516 | }, 517 | "0x0000000000000000000000000000000000000080": { 518 | "balance": "0x1" 519 | }, 520 | "0x0000000000000000000000000000000000000081": { 521 | "balance": "0x1" 522 | }, 523 | "0x0000000000000000000000000000000000000082": { 524 | "balance": "0x1" 525 | }, 526 | "0x0000000000000000000000000000000000000083": { 527 | "balance": "0x1" 528 | }, 529 | "0x0000000000000000000000000000000000000084": { 530 | "balance": "0x1" 531 | }, 532 | "0x0000000000000000000000000000000000000085": { 533 | "balance": "0x1" 534 | }, 535 | "0x0000000000000000000000000000000000000086": { 536 | "balance": "0x1" 537 | }, 538 | "0x0000000000000000000000000000000000000087": { 539 | "balance": "0x1" 540 | }, 541 | "0x0000000000000000000000000000000000000088": { 542 | "balance": "0x1" 543 | }, 544 | "0x0000000000000000000000000000000000000089": { 545 | "balance": "0x1" 546 | }, 547 | "0x000000000000000000000000000000000000008a": { 548 | "balance": "0x1" 549 | }, 550 | "0x000000000000000000000000000000000000008b": { 551 | "balance": "0x1" 552 | }, 553 | "0x000000000000000000000000000000000000008c": { 554 | "balance": "0x1" 555 | }, 556 | "0x000000000000000000000000000000000000008d": { 557 | "balance": "0x1" 558 | }, 559 | "0x000000000000000000000000000000000000008e": { 560 | "balance": "0x1" 561 | }, 562 | "0x000000000000000000000000000000000000008f": { 563 | "balance": "0x1" 564 | }, 565 | "0x0000000000000000000000000000000000000090": { 566 | "balance": "0x1" 567 | }, 568 | "0x0000000000000000000000000000000000000091": { 569 | "balance": "0x1" 570 | }, 571 | "0x0000000000000000000000000000000000000092": { 572 | "balance": "0x1" 573 | }, 574 | "0x0000000000000000000000000000000000000093": { 575 | "balance": "0x1" 576 | }, 577 | "0x0000000000000000000000000000000000000094": { 578 | "balance": "0x1" 579 | }, 580 | "0x0000000000000000000000000000000000000095": { 581 | "balance": "0x1" 582 | }, 583 | "0x0000000000000000000000000000000000000096": { 584 | "balance": "0x1" 585 | }, 586 | "0x0000000000000000000000000000000000000097": { 587 | "balance": "0x1" 588 | }, 589 | "0x0000000000000000000000000000000000000098": { 590 | "balance": "0x1" 591 | }, 592 | "0x0000000000000000000000000000000000000099": { 593 | "balance": "0x1" 594 | }, 595 | "0x000000000000000000000000000000000000009a": { 596 | "balance": "0x1" 597 | }, 598 | "0x000000000000000000000000000000000000009b": { 599 | "balance": "0x1" 600 | }, 601 | "0x000000000000000000000000000000000000009c": { 602 | "balance": "0x1" 603 | }, 604 | "0x000000000000000000000000000000000000009d": { 605 | "balance": "0x1" 606 | }, 607 | "0x000000000000000000000000000000000000009e": { 608 | "balance": "0x1" 609 | }, 610 | "0x000000000000000000000000000000000000009f": { 611 | "balance": "0x1" 612 | }, 613 | "0x00000000000000000000000000000000000000a0": { 614 | "balance": "0x1" 615 | }, 616 | "0x00000000000000000000000000000000000000a1": { 617 | "balance": "0x1" 618 | }, 619 | "0x00000000000000000000000000000000000000a2": { 620 | "balance": "0x1" 621 | }, 622 | "0x00000000000000000000000000000000000000a3": { 623 | "balance": "0x1" 624 | }, 625 | "0x00000000000000000000000000000000000000a4": { 626 | "balance": "0x1" 627 | }, 628 | "0x00000000000000000000000000000000000000a5": { 629 | "balance": "0x1" 630 | }, 631 | "0x00000000000000000000000000000000000000a6": { 632 | "balance": "0x1" 633 | }, 634 | "0x00000000000000000000000000000000000000a7": { 635 | "balance": "0x1" 636 | }, 637 | "0x00000000000000000000000000000000000000a8": { 638 | "balance": "0x1" 639 | }, 640 | "0x00000000000000000000000000000000000000a9": { 641 | "balance": "0x1" 642 | }, 643 | "0x00000000000000000000000000000000000000aa": { 644 | "balance": "0x1" 645 | }, 646 | "0x00000000000000000000000000000000000000ab": { 647 | "balance": "0x1" 648 | }, 649 | "0x00000000000000000000000000000000000000ac": { 650 | "balance": "0x1" 651 | }, 652 | "0x00000000000000000000000000000000000000ad": { 653 | "balance": "0x1" 654 | }, 655 | "0x00000000000000000000000000000000000000ae": { 656 | "balance": "0x1" 657 | }, 658 | "0x00000000000000000000000000000000000000af": { 659 | "balance": "0x1" 660 | }, 661 | "0x00000000000000000000000000000000000000b0": { 662 | "balance": "0x1" 663 | }, 664 | "0x00000000000000000000000000000000000000b1": { 665 | "balance": "0x1" 666 | }, 667 | "0x00000000000000000000000000000000000000b2": { 668 | "balance": "0x1" 669 | }, 670 | "0x00000000000000000000000000000000000000b3": { 671 | "balance": "0x1" 672 | }, 673 | "0x00000000000000000000000000000000000000b4": { 674 | "balance": "0x1" 675 | }, 676 | "0x00000000000000000000000000000000000000b5": { 677 | "balance": "0x1" 678 | }, 679 | "0x00000000000000000000000000000000000000b6": { 680 | "balance": "0x1" 681 | }, 682 | "0x00000000000000000000000000000000000000b7": { 683 | "balance": "0x1" 684 | }, 685 | "0x00000000000000000000000000000000000000b8": { 686 | "balance": "0x1" 687 | }, 688 | "0x00000000000000000000000000000000000000b9": { 689 | "balance": "0x1" 690 | }, 691 | "0x00000000000000000000000000000000000000ba": { 692 | "balance": "0x1" 693 | }, 694 | "0x00000000000000000000000000000000000000bb": { 695 | "balance": "0x1" 696 | }, 697 | "0x00000000000000000000000000000000000000bc": { 698 | "balance": "0x1" 699 | }, 700 | "0x00000000000000000000000000000000000000bd": { 701 | "balance": "0x1" 702 | }, 703 | "0x00000000000000000000000000000000000000be": { 704 | "balance": "0x1" 705 | }, 706 | "0x00000000000000000000000000000000000000bf": { 707 | "balance": "0x1" 708 | }, 709 | "0x00000000000000000000000000000000000000c0": { 710 | "balance": "0x1" 711 | }, 712 | "0x00000000000000000000000000000000000000c1": { 713 | "balance": "0x1" 714 | }, 715 | "0x00000000000000000000000000000000000000c2": { 716 | "balance": "0x1" 717 | }, 718 | "0x00000000000000000000000000000000000000c3": { 719 | "balance": "0x1" 720 | }, 721 | "0x00000000000000000000000000000000000000c4": { 722 | "balance": "0x1" 723 | }, 724 | "0x00000000000000000000000000000000000000c5": { 725 | "balance": "0x1" 726 | }, 727 | "0x00000000000000000000000000000000000000c6": { 728 | "balance": "0x1" 729 | }, 730 | "0x00000000000000000000000000000000000000c7": { 731 | "balance": "0x1" 732 | }, 733 | "0x00000000000000000000000000000000000000c8": { 734 | "balance": "0x1" 735 | }, 736 | "0x00000000000000000000000000000000000000c9": { 737 | "balance": "0x1" 738 | }, 739 | "0x00000000000000000000000000000000000000ca": { 740 | "balance": "0x1" 741 | }, 742 | "0x00000000000000000000000000000000000000cb": { 743 | "balance": "0x1" 744 | }, 745 | "0x00000000000000000000000000000000000000cc": { 746 | "balance": "0x1" 747 | }, 748 | "0x00000000000000000000000000000000000000cd": { 749 | "balance": "0x1" 750 | }, 751 | "0x00000000000000000000000000000000000000ce": { 752 | "balance": "0x1" 753 | }, 754 | "0x00000000000000000000000000000000000000cf": { 755 | "balance": "0x1" 756 | }, 757 | "0x00000000000000000000000000000000000000d0": { 758 | "balance": "0x1" 759 | }, 760 | "0x00000000000000000000000000000000000000d1": { 761 | "balance": "0x1" 762 | }, 763 | "0x00000000000000000000000000000000000000d2": { 764 | "balance": "0x1" 765 | }, 766 | "0x00000000000000000000000000000000000000d3": { 767 | "balance": "0x1" 768 | }, 769 | "0x00000000000000000000000000000000000000d4": { 770 | "balance": "0x1" 771 | }, 772 | "0x00000000000000000000000000000000000000d5": { 773 | "balance": "0x1" 774 | }, 775 | "0x00000000000000000000000000000000000000d6": { 776 | "balance": "0x1" 777 | }, 778 | "0x00000000000000000000000000000000000000d7": { 779 | "balance": "0x1" 780 | }, 781 | "0x00000000000000000000000000000000000000d8": { 782 | "balance": "0x1" 783 | }, 784 | "0x00000000000000000000000000000000000000d9": { 785 | "balance": "0x1" 786 | }, 787 | "0x00000000000000000000000000000000000000da": { 788 | "balance": "0x1" 789 | }, 790 | "0x00000000000000000000000000000000000000db": { 791 | "balance": "0x1" 792 | }, 793 | "0x00000000000000000000000000000000000000dc": { 794 | "balance": "0x1" 795 | }, 796 | "0x00000000000000000000000000000000000000dd": { 797 | "balance": "0x1" 798 | }, 799 | "0x00000000000000000000000000000000000000de": { 800 | "balance": "0x1" 801 | }, 802 | "0x00000000000000000000000000000000000000df": { 803 | "balance": "0x1" 804 | }, 805 | "0x00000000000000000000000000000000000000e0": { 806 | "balance": "0x1" 807 | }, 808 | "0x00000000000000000000000000000000000000e1": { 809 | "balance": "0x1" 810 | }, 811 | "0x00000000000000000000000000000000000000e2": { 812 | "balance": "0x1" 813 | }, 814 | "0x00000000000000000000000000000000000000e3": { 815 | "balance": "0x1" 816 | }, 817 | "0x00000000000000000000000000000000000000e4": { 818 | "balance": "0x1" 819 | }, 820 | "0x00000000000000000000000000000000000000e5": { 821 | "balance": "0x1" 822 | }, 823 | "0x00000000000000000000000000000000000000e6": { 824 | "balance": "0x1" 825 | }, 826 | "0x00000000000000000000000000000000000000e7": { 827 | "balance": "0x1" 828 | }, 829 | "0x00000000000000000000000000000000000000e8": { 830 | "balance": "0x1" 831 | }, 832 | "0x00000000000000000000000000000000000000e9": { 833 | "balance": "0x1" 834 | }, 835 | "0x00000000000000000000000000000000000000ea": { 836 | "balance": "0x1" 837 | }, 838 | "0x00000000000000000000000000000000000000eb": { 839 | "balance": "0x1" 840 | }, 841 | "0x00000000000000000000000000000000000000ec": { 842 | "balance": "0x1" 843 | }, 844 | "0x00000000000000000000000000000000000000ed": { 845 | "balance": "0x1" 846 | }, 847 | "0x00000000000000000000000000000000000000ee": { 848 | "balance": "0x1" 849 | }, 850 | "0x00000000000000000000000000000000000000ef": { 851 | "balance": "0x1" 852 | }, 853 | "0x00000000000000000000000000000000000000f0": { 854 | "balance": "0x1" 855 | }, 856 | "0x00000000000000000000000000000000000000f1": { 857 | "balance": "0x1" 858 | }, 859 | "0x00000000000000000000000000000000000000f2": { 860 | "balance": "0x1" 861 | }, 862 | "0x00000000000000000000000000000000000000f3": { 863 | "balance": "0x1" 864 | }, 865 | "0x00000000000000000000000000000000000000f4": { 866 | "balance": "0x1" 867 | }, 868 | "0x00000000000000000000000000000000000000f5": { 869 | "balance": "0x1" 870 | }, 871 | "0x00000000000000000000000000000000000000f6": { 872 | "balance": "0x1" 873 | }, 874 | "0x00000000000000000000000000000000000000f7": { 875 | "balance": "0x1" 876 | }, 877 | "0x00000000000000000000000000000000000000f8": { 878 | "balance": "0x1" 879 | }, 880 | "0x00000000000000000000000000000000000000f9": { 881 | "balance": "0x1" 882 | }, 883 | "0x00000000000000000000000000000000000000fa": { 884 | "balance": "0x1" 885 | }, 886 | "0x00000000000000000000000000000000000000fb": { 887 | "balance": "0x1" 888 | }, 889 | "0x00000000000000000000000000000000000000fc": { 890 | "balance": "0x1" 891 | }, 892 | "0x00000000000000000000000000000000000000fd": { 893 | "balance": "0x1" 894 | }, 895 | "0x00000000000000000000000000000000000000fe": { 896 | "balance": "0x1" 897 | }, 898 | "0x00000000000000000000000000000000000000ff": { 899 | "balance": "0x1" 900 | }, 901 | "0x009fcc115ad9ef38288a82a014dea30f63a84383": { 902 | "balance": "0x100000000000000000000000000000000000000000000000000" 903 | }, 904 | "0x0015c90d0e12186bc51c9d51aff4d3fb6e984291": { 905 | "balance": "0x100000000000000000000000000000000000000000000000000" 906 | } 907 | } 908 | } 909 | -------------------------------------------------------------------------------- /discovery-provider/chain/prod_spec_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "audius", 3 | "dataDir": "audius", 4 | "engine": { 5 | "clique": { 6 | "params": { 7 | "period": 1, 8 | "epoch": 30000 9 | } 10 | } 11 | }, 12 | "params": { 13 | "accountStartNonce": "0x0", 14 | "eip98Transition": "0xffffffffffffffff", 15 | "eip140Transition": "0x0", 16 | "eip145Transition": "0x0", 17 | "eip150Transition": "0x0", 18 | "eip155Transition": "0x0", 19 | "eip158Transition": "0x0", 20 | "eip160Transition": "0x0", 21 | "eip161abcTransition": "0x0", 22 | "eip161dTransition": "0x0", 23 | "eip211Transition": "0x0", 24 | "eip214Transition": "0x0", 25 | "eip658Transition": "0x0", 26 | "eip1014Transition": "0x0", 27 | "eip1052Transition": "0x0", 28 | "eip1283Transition": "0x0", 29 | "gasLimitBoundDivisor": "0x400", 30 | "homesteadTransition": "0x0", 31 | "kip4Transition": "0xffffffffffffffff", 32 | "kip6Transition": "0xffffffffffffffff", 33 | "maxCodeSize": "0x6000", 34 | "maxCodeSizeTransition": "0x0", 35 | "maximumExtraDataSize": "0x320", 36 | "minGasLimit": "0x1388", 37 | "networkID": "0x7b24", 38 | "validateReceipts": false, 39 | "validateReceiptsTransition": "0xffffffffffffffff", 40 | "wasmActivationTransition": "0xffffffffffffffff" 41 | }, 42 | "genesis": { 43 | "seal": { 44 | "ethereum": { 45 | "nonce": "0x0000000000000000", 46 | "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" 47 | } 48 | }, 49 | "author": "0x0000000000000000000000000000000000000000", 50 | "difficulty": "0x1", 51 | "extraData": "", 52 | "gasLimit": "0xa00000", 53 | "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 54 | "timestamp": "0x5bdda800" 55 | }, 56 | "nodes": [], 57 | "accounts": { 58 | "0x0000000000000000000000000000000000000000": { 59 | "balance": "0x1" 60 | }, 61 | "0x0000000000000000000000000000000000000001": { 62 | "balance": "0x1", 63 | "builtin": { 64 | "name": "ecrecover", 65 | "pricing": { 66 | "linear": { 67 | "base": 3000, 68 | "word": 0 69 | } 70 | } 71 | } 72 | }, 73 | "0x0000000000000000000000000000000000000002": { 74 | "balance": "0x1", 75 | "builtin": { 76 | "name": "sha256", 77 | "pricing": { 78 | "linear": { 79 | "base": 60, 80 | "word": 12 81 | } 82 | } 83 | } 84 | }, 85 | "0x0000000000000000000000000000000000000003": { 86 | "balance": "0x1", 87 | "builtin": { 88 | "name": "ripemd160", 89 | "pricing": { 90 | "linear": { 91 | "base": 600, 92 | "word": 120 93 | } 94 | } 95 | } 96 | }, 97 | "0x0000000000000000000000000000000000000004": { 98 | "balance": "0x1", 99 | "builtin": { 100 | "name": "identity", 101 | "pricing": { 102 | "linear": { 103 | "base": 15, 104 | "word": 3 105 | } 106 | } 107 | } 108 | }, 109 | "0x0000000000000000000000000000000000000005": { 110 | "balance": "0x1", 111 | "builtin": { 112 | "name": "modexp", 113 | "activate_at": "0x0", 114 | "pricing": { 115 | "modexp": { 116 | "divisor": 20 117 | } 118 | } 119 | } 120 | }, 121 | "0x0000000000000000000000000000000000000006": { 122 | "balance": "0x1", 123 | "builtin": { 124 | "name": "alt_bn128_add", 125 | "activate_at": "0x0", 126 | "pricing": { 127 | "linear": { 128 | "base": 500, 129 | "word": 0 130 | } 131 | } 132 | } 133 | }, 134 | "0x0000000000000000000000000000000000000007": { 135 | "balance": "0x1", 136 | "builtin": { 137 | "name": "alt_bn128_mul", 138 | "activate_at": "0x0", 139 | "pricing": { 140 | "linear": { 141 | "base": 40000, 142 | "word": 0 143 | } 144 | } 145 | } 146 | }, 147 | "0x0000000000000000000000000000000000000008": { 148 | "balance": "0x1", 149 | "builtin": { 150 | "name": "alt_bn128_pairing", 151 | "activate_at": "0x0", 152 | "pricing": { 153 | "alt_bn128_pairing": { 154 | "base": 100000, 155 | "pair": 80000 156 | } 157 | } 158 | } 159 | }, 160 | "0x0000000000000000000000000000000000000009": { 161 | "balance": "0x1" 162 | }, 163 | "0x000000000000000000000000000000000000000a": { 164 | "balance": "0x1" 165 | }, 166 | "0x000000000000000000000000000000000000000b": { 167 | "balance": "0x1" 168 | }, 169 | "0x000000000000000000000000000000000000000c": { 170 | "balance": "0x1" 171 | }, 172 | "0x000000000000000000000000000000000000000d": { 173 | "balance": "0x1" 174 | }, 175 | "0x000000000000000000000000000000000000000e": { 176 | "balance": "0x1" 177 | }, 178 | "0x000000000000000000000000000000000000000f": { 179 | "balance": "0x1" 180 | }, 181 | "0x0000000000000000000000000000000000000010": { 182 | "balance": "0x1" 183 | }, 184 | "0x0000000000000000000000000000000000000011": { 185 | "balance": "0x1" 186 | }, 187 | "0x0000000000000000000000000000000000000012": { 188 | "balance": "0x1" 189 | }, 190 | "0x0000000000000000000000000000000000000013": { 191 | "balance": "0x1" 192 | }, 193 | "0x0000000000000000000000000000000000000014": { 194 | "balance": "0x1" 195 | }, 196 | "0x0000000000000000000000000000000000000015": { 197 | "balance": "0x1" 198 | }, 199 | "0x0000000000000000000000000000000000000016": { 200 | "balance": "0x1" 201 | }, 202 | "0x0000000000000000000000000000000000000017": { 203 | "balance": "0x1" 204 | }, 205 | "0x0000000000000000000000000000000000000018": { 206 | "balance": "0x1" 207 | }, 208 | "0x0000000000000000000000000000000000000019": { 209 | "balance": "0x1" 210 | }, 211 | "0x000000000000000000000000000000000000001a": { 212 | "balance": "0x1" 213 | }, 214 | "0x000000000000000000000000000000000000001b": { 215 | "balance": "0x1" 216 | }, 217 | "0x000000000000000000000000000000000000001c": { 218 | "balance": "0x1" 219 | }, 220 | "0x000000000000000000000000000000000000001d": { 221 | "balance": "0x1" 222 | }, 223 | "0x000000000000000000000000000000000000001e": { 224 | "balance": "0x1" 225 | }, 226 | "0x000000000000000000000000000000000000001f": { 227 | "balance": "0x1" 228 | }, 229 | "0x0000000000000000000000000000000000000020": { 230 | "balance": "0x1" 231 | }, 232 | "0x0000000000000000000000000000000000000021": { 233 | "balance": "0x1" 234 | }, 235 | "0x0000000000000000000000000000000000000022": { 236 | "balance": "0x1" 237 | }, 238 | "0x0000000000000000000000000000000000000023": { 239 | "balance": "0x1" 240 | }, 241 | "0x0000000000000000000000000000000000000024": { 242 | "balance": "0x1" 243 | }, 244 | "0x0000000000000000000000000000000000000025": { 245 | "balance": "0x1" 246 | }, 247 | "0x0000000000000000000000000000000000000026": { 248 | "balance": "0x1" 249 | }, 250 | "0x0000000000000000000000000000000000000027": { 251 | "balance": "0x1" 252 | }, 253 | "0x0000000000000000000000000000000000000028": { 254 | "balance": "0x1" 255 | }, 256 | "0x0000000000000000000000000000000000000029": { 257 | "balance": "0x1" 258 | }, 259 | "0x000000000000000000000000000000000000002a": { 260 | "balance": "0x1" 261 | }, 262 | "0x000000000000000000000000000000000000002b": { 263 | "balance": "0x1" 264 | }, 265 | "0x000000000000000000000000000000000000002c": { 266 | "balance": "0x1" 267 | }, 268 | "0x000000000000000000000000000000000000002d": { 269 | "balance": "0x1" 270 | }, 271 | "0x000000000000000000000000000000000000002e": { 272 | "balance": "0x1" 273 | }, 274 | "0x000000000000000000000000000000000000002f": { 275 | "balance": "0x1" 276 | }, 277 | "0x0000000000000000000000000000000000000030": { 278 | "balance": "0x1" 279 | }, 280 | "0x0000000000000000000000000000000000000031": { 281 | "balance": "0x1" 282 | }, 283 | "0x0000000000000000000000000000000000000032": { 284 | "balance": "0x1" 285 | }, 286 | "0x0000000000000000000000000000000000000033": { 287 | "balance": "0x1" 288 | }, 289 | "0x0000000000000000000000000000000000000034": { 290 | "balance": "0x1" 291 | }, 292 | "0x0000000000000000000000000000000000000035": { 293 | "balance": "0x1" 294 | }, 295 | "0x0000000000000000000000000000000000000036": { 296 | "balance": "0x1" 297 | }, 298 | "0x0000000000000000000000000000000000000037": { 299 | "balance": "0x1" 300 | }, 301 | "0x0000000000000000000000000000000000000038": { 302 | "balance": "0x1" 303 | }, 304 | "0x0000000000000000000000000000000000000039": { 305 | "balance": "0x1" 306 | }, 307 | "0x000000000000000000000000000000000000003a": { 308 | "balance": "0x1" 309 | }, 310 | "0x000000000000000000000000000000000000003b": { 311 | "balance": "0x1" 312 | }, 313 | "0x000000000000000000000000000000000000003c": { 314 | "balance": "0x1" 315 | }, 316 | "0x000000000000000000000000000000000000003d": { 317 | "balance": "0x1" 318 | }, 319 | "0x000000000000000000000000000000000000003e": { 320 | "balance": "0x1" 321 | }, 322 | "0x000000000000000000000000000000000000003f": { 323 | "balance": "0x1" 324 | }, 325 | "0x0000000000000000000000000000000000000040": { 326 | "balance": "0x1" 327 | }, 328 | "0x0000000000000000000000000000000000000041": { 329 | "balance": "0x1" 330 | }, 331 | "0x0000000000000000000000000000000000000042": { 332 | "balance": "0x1" 333 | }, 334 | "0x0000000000000000000000000000000000000043": { 335 | "balance": "0x1" 336 | }, 337 | "0x0000000000000000000000000000000000000044": { 338 | "balance": "0x1" 339 | }, 340 | "0x0000000000000000000000000000000000000045": { 341 | "balance": "0x1" 342 | }, 343 | "0x0000000000000000000000000000000000000046": { 344 | "balance": "0x1" 345 | }, 346 | "0x0000000000000000000000000000000000000047": { 347 | "balance": "0x1" 348 | }, 349 | "0x0000000000000000000000000000000000000048": { 350 | "balance": "0x1" 351 | }, 352 | "0x0000000000000000000000000000000000000049": { 353 | "balance": "0x1" 354 | }, 355 | "0x000000000000000000000000000000000000004a": { 356 | "balance": "0x1" 357 | }, 358 | "0x000000000000000000000000000000000000004b": { 359 | "balance": "0x1" 360 | }, 361 | "0x000000000000000000000000000000000000004c": { 362 | "balance": "0x1" 363 | }, 364 | "0x000000000000000000000000000000000000004d": { 365 | "balance": "0x1" 366 | }, 367 | "0x000000000000000000000000000000000000004e": { 368 | "balance": "0x1" 369 | }, 370 | "0x000000000000000000000000000000000000004f": { 371 | "balance": "0x1" 372 | }, 373 | "0x0000000000000000000000000000000000000050": { 374 | "balance": "0x1" 375 | }, 376 | "0x0000000000000000000000000000000000000051": { 377 | "balance": "0x1" 378 | }, 379 | "0x0000000000000000000000000000000000000052": { 380 | "balance": "0x1" 381 | }, 382 | "0x0000000000000000000000000000000000000053": { 383 | "balance": "0x1" 384 | }, 385 | "0x0000000000000000000000000000000000000054": { 386 | "balance": "0x1" 387 | }, 388 | "0x0000000000000000000000000000000000000055": { 389 | "balance": "0x1" 390 | }, 391 | "0x0000000000000000000000000000000000000056": { 392 | "balance": "0x1" 393 | }, 394 | "0x0000000000000000000000000000000000000057": { 395 | "balance": "0x1" 396 | }, 397 | "0x0000000000000000000000000000000000000058": { 398 | "balance": "0x1" 399 | }, 400 | "0x0000000000000000000000000000000000000059": { 401 | "balance": "0x1" 402 | }, 403 | "0x000000000000000000000000000000000000005a": { 404 | "balance": "0x1" 405 | }, 406 | "0x000000000000000000000000000000000000005b": { 407 | "balance": "0x1" 408 | }, 409 | "0x000000000000000000000000000000000000005c": { 410 | "balance": "0x1" 411 | }, 412 | "0x000000000000000000000000000000000000005d": { 413 | "balance": "0x1" 414 | }, 415 | "0x000000000000000000000000000000000000005e": { 416 | "balance": "0x1" 417 | }, 418 | "0x000000000000000000000000000000000000005f": { 419 | "balance": "0x1" 420 | }, 421 | "0x0000000000000000000000000000000000000060": { 422 | "balance": "0x1" 423 | }, 424 | "0x0000000000000000000000000000000000000061": { 425 | "balance": "0x1" 426 | }, 427 | "0x0000000000000000000000000000000000000062": { 428 | "balance": "0x1" 429 | }, 430 | "0x0000000000000000000000000000000000000063": { 431 | "balance": "0x1" 432 | }, 433 | "0x0000000000000000000000000000000000000064": { 434 | "balance": "0x1" 435 | }, 436 | "0x0000000000000000000000000000000000000065": { 437 | "balance": "0x1" 438 | }, 439 | "0x0000000000000000000000000000000000000066": { 440 | "balance": "0x1" 441 | }, 442 | "0x0000000000000000000000000000000000000067": { 443 | "balance": "0x1" 444 | }, 445 | "0x0000000000000000000000000000000000000068": { 446 | "balance": "0x1" 447 | }, 448 | "0x0000000000000000000000000000000000000069": { 449 | "balance": "0x1" 450 | }, 451 | "0x000000000000000000000000000000000000006a": { 452 | "balance": "0x1" 453 | }, 454 | "0x000000000000000000000000000000000000006b": { 455 | "balance": "0x1" 456 | }, 457 | "0x000000000000000000000000000000000000006c": { 458 | "balance": "0x1" 459 | }, 460 | "0x000000000000000000000000000000000000006d": { 461 | "balance": "0x1" 462 | }, 463 | "0x000000000000000000000000000000000000006e": { 464 | "balance": "0x1" 465 | }, 466 | "0x000000000000000000000000000000000000006f": { 467 | "balance": "0x1" 468 | }, 469 | "0x0000000000000000000000000000000000000070": { 470 | "balance": "0x1" 471 | }, 472 | "0x0000000000000000000000000000000000000071": { 473 | "balance": "0x1" 474 | }, 475 | "0x0000000000000000000000000000000000000072": { 476 | "balance": "0x1" 477 | }, 478 | "0x0000000000000000000000000000000000000073": { 479 | "balance": "0x1" 480 | }, 481 | "0x0000000000000000000000000000000000000074": { 482 | "balance": "0x1" 483 | }, 484 | "0x0000000000000000000000000000000000000075": { 485 | "balance": "0x1" 486 | }, 487 | "0x0000000000000000000000000000000000000076": { 488 | "balance": "0x1" 489 | }, 490 | "0x0000000000000000000000000000000000000077": { 491 | "balance": "0x1" 492 | }, 493 | "0x0000000000000000000000000000000000000078": { 494 | "balance": "0x1" 495 | }, 496 | "0x0000000000000000000000000000000000000079": { 497 | "balance": "0x1" 498 | }, 499 | "0x000000000000000000000000000000000000007a": { 500 | "balance": "0x1" 501 | }, 502 | "0x000000000000000000000000000000000000007b": { 503 | "balance": "0x1" 504 | }, 505 | "0x000000000000000000000000000000000000007c": { 506 | "balance": "0x1" 507 | }, 508 | "0x000000000000000000000000000000000000007d": { 509 | "balance": "0x1" 510 | }, 511 | "0x000000000000000000000000000000000000007e": { 512 | "balance": "0x1" 513 | }, 514 | "0x000000000000000000000000000000000000007f": { 515 | "balance": "0x1" 516 | }, 517 | "0x0000000000000000000000000000000000000080": { 518 | "balance": "0x1" 519 | }, 520 | "0x0000000000000000000000000000000000000081": { 521 | "balance": "0x1" 522 | }, 523 | "0x0000000000000000000000000000000000000082": { 524 | "balance": "0x1" 525 | }, 526 | "0x0000000000000000000000000000000000000083": { 527 | "balance": "0x1" 528 | }, 529 | "0x0000000000000000000000000000000000000084": { 530 | "balance": "0x1" 531 | }, 532 | "0x0000000000000000000000000000000000000085": { 533 | "balance": "0x1" 534 | }, 535 | "0x0000000000000000000000000000000000000086": { 536 | "balance": "0x1" 537 | }, 538 | "0x0000000000000000000000000000000000000087": { 539 | "balance": "0x1" 540 | }, 541 | "0x0000000000000000000000000000000000000088": { 542 | "balance": "0x1" 543 | }, 544 | "0x0000000000000000000000000000000000000089": { 545 | "balance": "0x1" 546 | }, 547 | "0x000000000000000000000000000000000000008a": { 548 | "balance": "0x1" 549 | }, 550 | "0x000000000000000000000000000000000000008b": { 551 | "balance": "0x1" 552 | }, 553 | "0x000000000000000000000000000000000000008c": { 554 | "balance": "0x1" 555 | }, 556 | "0x000000000000000000000000000000000000008d": { 557 | "balance": "0x1" 558 | }, 559 | "0x000000000000000000000000000000000000008e": { 560 | "balance": "0x1" 561 | }, 562 | "0x000000000000000000000000000000000000008f": { 563 | "balance": "0x1" 564 | }, 565 | "0x0000000000000000000000000000000000000090": { 566 | "balance": "0x1" 567 | }, 568 | "0x0000000000000000000000000000000000000091": { 569 | "balance": "0x1" 570 | }, 571 | "0x0000000000000000000000000000000000000092": { 572 | "balance": "0x1" 573 | }, 574 | "0x0000000000000000000000000000000000000093": { 575 | "balance": "0x1" 576 | }, 577 | "0x0000000000000000000000000000000000000094": { 578 | "balance": "0x1" 579 | }, 580 | "0x0000000000000000000000000000000000000095": { 581 | "balance": "0x1" 582 | }, 583 | "0x0000000000000000000000000000000000000096": { 584 | "balance": "0x1" 585 | }, 586 | "0x0000000000000000000000000000000000000097": { 587 | "balance": "0x1" 588 | }, 589 | "0x0000000000000000000000000000000000000098": { 590 | "balance": "0x1" 591 | }, 592 | "0x0000000000000000000000000000000000000099": { 593 | "balance": "0x1" 594 | }, 595 | "0x000000000000000000000000000000000000009a": { 596 | "balance": "0x1" 597 | }, 598 | "0x000000000000000000000000000000000000009b": { 599 | "balance": "0x1" 600 | }, 601 | "0x000000000000000000000000000000000000009c": { 602 | "balance": "0x1" 603 | }, 604 | "0x000000000000000000000000000000000000009d": { 605 | "balance": "0x1" 606 | }, 607 | "0x000000000000000000000000000000000000009e": { 608 | "balance": "0x1" 609 | }, 610 | "0x000000000000000000000000000000000000009f": { 611 | "balance": "0x1" 612 | }, 613 | "0x00000000000000000000000000000000000000a0": { 614 | "balance": "0x1" 615 | }, 616 | "0x00000000000000000000000000000000000000a1": { 617 | "balance": "0x1" 618 | }, 619 | "0x00000000000000000000000000000000000000a2": { 620 | "balance": "0x1" 621 | }, 622 | "0x00000000000000000000000000000000000000a3": { 623 | "balance": "0x1" 624 | }, 625 | "0x00000000000000000000000000000000000000a4": { 626 | "balance": "0x1" 627 | }, 628 | "0x00000000000000000000000000000000000000a5": { 629 | "balance": "0x1" 630 | }, 631 | "0x00000000000000000000000000000000000000a6": { 632 | "balance": "0x1" 633 | }, 634 | "0x00000000000000000000000000000000000000a7": { 635 | "balance": "0x1" 636 | }, 637 | "0x00000000000000000000000000000000000000a8": { 638 | "balance": "0x1" 639 | }, 640 | "0x00000000000000000000000000000000000000a9": { 641 | "balance": "0x1" 642 | }, 643 | "0x00000000000000000000000000000000000000aa": { 644 | "balance": "0x1" 645 | }, 646 | "0x00000000000000000000000000000000000000ab": { 647 | "balance": "0x1" 648 | }, 649 | "0x00000000000000000000000000000000000000ac": { 650 | "balance": "0x1" 651 | }, 652 | "0x00000000000000000000000000000000000000ad": { 653 | "balance": "0x1" 654 | }, 655 | "0x00000000000000000000000000000000000000ae": { 656 | "balance": "0x1" 657 | }, 658 | "0x00000000000000000000000000000000000000af": { 659 | "balance": "0x1" 660 | }, 661 | "0x00000000000000000000000000000000000000b0": { 662 | "balance": "0x1" 663 | }, 664 | "0x00000000000000000000000000000000000000b1": { 665 | "balance": "0x1" 666 | }, 667 | "0x00000000000000000000000000000000000000b2": { 668 | "balance": "0x1" 669 | }, 670 | "0x00000000000000000000000000000000000000b3": { 671 | "balance": "0x1" 672 | }, 673 | "0x00000000000000000000000000000000000000b4": { 674 | "balance": "0x1" 675 | }, 676 | "0x00000000000000000000000000000000000000b5": { 677 | "balance": "0x1" 678 | }, 679 | "0x00000000000000000000000000000000000000b6": { 680 | "balance": "0x1" 681 | }, 682 | "0x00000000000000000000000000000000000000b7": { 683 | "balance": "0x1" 684 | }, 685 | "0x00000000000000000000000000000000000000b8": { 686 | "balance": "0x1" 687 | }, 688 | "0x00000000000000000000000000000000000000b9": { 689 | "balance": "0x1" 690 | }, 691 | "0x00000000000000000000000000000000000000ba": { 692 | "balance": "0x1" 693 | }, 694 | "0x00000000000000000000000000000000000000bb": { 695 | "balance": "0x1" 696 | }, 697 | "0x00000000000000000000000000000000000000bc": { 698 | "balance": "0x1" 699 | }, 700 | "0x00000000000000000000000000000000000000bd": { 701 | "balance": "0x1" 702 | }, 703 | "0x00000000000000000000000000000000000000be": { 704 | "balance": "0x1" 705 | }, 706 | "0x00000000000000000000000000000000000000bf": { 707 | "balance": "0x1" 708 | }, 709 | "0x00000000000000000000000000000000000000c0": { 710 | "balance": "0x1" 711 | }, 712 | "0x00000000000000000000000000000000000000c1": { 713 | "balance": "0x1" 714 | }, 715 | "0x00000000000000000000000000000000000000c2": { 716 | "balance": "0x1" 717 | }, 718 | "0x00000000000000000000000000000000000000c3": { 719 | "balance": "0x1" 720 | }, 721 | "0x00000000000000000000000000000000000000c4": { 722 | "balance": "0x1" 723 | }, 724 | "0x00000000000000000000000000000000000000c5": { 725 | "balance": "0x1" 726 | }, 727 | "0x00000000000000000000000000000000000000c6": { 728 | "balance": "0x1" 729 | }, 730 | "0x00000000000000000000000000000000000000c7": { 731 | "balance": "0x1" 732 | }, 733 | "0x00000000000000000000000000000000000000c8": { 734 | "balance": "0x1" 735 | }, 736 | "0x00000000000000000000000000000000000000c9": { 737 | "balance": "0x1" 738 | }, 739 | "0x00000000000000000000000000000000000000ca": { 740 | "balance": "0x1" 741 | }, 742 | "0x00000000000000000000000000000000000000cb": { 743 | "balance": "0x1" 744 | }, 745 | "0x00000000000000000000000000000000000000cc": { 746 | "balance": "0x1" 747 | }, 748 | "0x00000000000000000000000000000000000000cd": { 749 | "balance": "0x1" 750 | }, 751 | "0x00000000000000000000000000000000000000ce": { 752 | "balance": "0x1" 753 | }, 754 | "0x00000000000000000000000000000000000000cf": { 755 | "balance": "0x1" 756 | }, 757 | "0x00000000000000000000000000000000000000d0": { 758 | "balance": "0x1" 759 | }, 760 | "0x00000000000000000000000000000000000000d1": { 761 | "balance": "0x1" 762 | }, 763 | "0x00000000000000000000000000000000000000d2": { 764 | "balance": "0x1" 765 | }, 766 | "0x00000000000000000000000000000000000000d3": { 767 | "balance": "0x1" 768 | }, 769 | "0x00000000000000000000000000000000000000d4": { 770 | "balance": "0x1" 771 | }, 772 | "0x00000000000000000000000000000000000000d5": { 773 | "balance": "0x1" 774 | }, 775 | "0x00000000000000000000000000000000000000d6": { 776 | "balance": "0x1" 777 | }, 778 | "0x00000000000000000000000000000000000000d7": { 779 | "balance": "0x1" 780 | }, 781 | "0x00000000000000000000000000000000000000d8": { 782 | "balance": "0x1" 783 | }, 784 | "0x00000000000000000000000000000000000000d9": { 785 | "balance": "0x1" 786 | }, 787 | "0x00000000000000000000000000000000000000da": { 788 | "balance": "0x1" 789 | }, 790 | "0x00000000000000000000000000000000000000db": { 791 | "balance": "0x1" 792 | }, 793 | "0x00000000000000000000000000000000000000dc": { 794 | "balance": "0x1" 795 | }, 796 | "0x00000000000000000000000000000000000000dd": { 797 | "balance": "0x1" 798 | }, 799 | "0x00000000000000000000000000000000000000de": { 800 | "balance": "0x1" 801 | }, 802 | "0x00000000000000000000000000000000000000df": { 803 | "balance": "0x1" 804 | }, 805 | "0x00000000000000000000000000000000000000e0": { 806 | "balance": "0x1" 807 | }, 808 | "0x00000000000000000000000000000000000000e1": { 809 | "balance": "0x1" 810 | }, 811 | "0x00000000000000000000000000000000000000e2": { 812 | "balance": "0x1" 813 | }, 814 | "0x00000000000000000000000000000000000000e3": { 815 | "balance": "0x1" 816 | }, 817 | "0x00000000000000000000000000000000000000e4": { 818 | "balance": "0x1" 819 | }, 820 | "0x00000000000000000000000000000000000000e5": { 821 | "balance": "0x1" 822 | }, 823 | "0x00000000000000000000000000000000000000e6": { 824 | "balance": "0x1" 825 | }, 826 | "0x00000000000000000000000000000000000000e7": { 827 | "balance": "0x1" 828 | }, 829 | "0x00000000000000000000000000000000000000e8": { 830 | "balance": "0x1" 831 | }, 832 | "0x00000000000000000000000000000000000000e9": { 833 | "balance": "0x1" 834 | }, 835 | "0x00000000000000000000000000000000000000ea": { 836 | "balance": "0x1" 837 | }, 838 | "0x00000000000000000000000000000000000000eb": { 839 | "balance": "0x1" 840 | }, 841 | "0x00000000000000000000000000000000000000ec": { 842 | "balance": "0x1" 843 | }, 844 | "0x00000000000000000000000000000000000000ed": { 845 | "balance": "0x1" 846 | }, 847 | "0x00000000000000000000000000000000000000ee": { 848 | "balance": "0x1" 849 | }, 850 | "0x00000000000000000000000000000000000000ef": { 851 | "balance": "0x1" 852 | }, 853 | "0x00000000000000000000000000000000000000f0": { 854 | "balance": "0x1" 855 | }, 856 | "0x00000000000000000000000000000000000000f1": { 857 | "balance": "0x1" 858 | }, 859 | "0x00000000000000000000000000000000000000f2": { 860 | "balance": "0x1" 861 | }, 862 | "0x00000000000000000000000000000000000000f3": { 863 | "balance": "0x1" 864 | }, 865 | "0x00000000000000000000000000000000000000f4": { 866 | "balance": "0x1" 867 | }, 868 | "0x00000000000000000000000000000000000000f5": { 869 | "balance": "0x1" 870 | }, 871 | "0x00000000000000000000000000000000000000f6": { 872 | "balance": "0x1" 873 | }, 874 | "0x00000000000000000000000000000000000000f7": { 875 | "balance": "0x1" 876 | }, 877 | "0x00000000000000000000000000000000000000f8": { 878 | "balance": "0x1" 879 | }, 880 | "0x00000000000000000000000000000000000000f9": { 881 | "balance": "0x1" 882 | }, 883 | "0x00000000000000000000000000000000000000fa": { 884 | "balance": "0x1" 885 | }, 886 | "0x00000000000000000000000000000000000000fb": { 887 | "balance": "0x1" 888 | }, 889 | "0x00000000000000000000000000000000000000fc": { 890 | "balance": "0x1" 891 | }, 892 | "0x00000000000000000000000000000000000000fd": { 893 | "balance": "0x1" 894 | }, 895 | "0x00000000000000000000000000000000000000fe": { 896 | "balance": "0x1" 897 | }, 898 | "0x00000000000000000000000000000000000000ff": { 899 | "balance": "0x1" 900 | }, 901 | "0x009fcc115ad9ef38288a82a014dea30f63a84383": { 902 | "balance": "0x100000000000000000000000000000000000000000000000000" 903 | }, 904 | "0x0015c90d0e12186bc51c9d51aff4d3fb6e984291": { 905 | "balance": "0x100000000000000000000000000000000000000000000000000" 906 | } 907 | } 908 | } 909 | -------------------------------------------------------------------------------- /discovery-provider/chain/stage_spec_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "audius", 3 | "dataDir": "audius", 4 | "engine": { 5 | "clique": { 6 | "params": { 7 | "period": 1, 8 | "epoch": 30000 9 | } 10 | } 11 | }, 12 | "params": { 13 | "accountStartNonce": "0x0", 14 | "eip98Transition": "0xffffffffffffffff", 15 | "eip140Transition": "0x0", 16 | "eip145Transition": "0x0", 17 | "eip150Transition": "0x0", 18 | "eip155Transition": "0x0", 19 | "eip158Transition": "0x0", 20 | "eip160Transition": "0x0", 21 | "eip161abcTransition": "0x0", 22 | "eip161dTransition": "0x0", 23 | "eip211Transition": "0x0", 24 | "eip214Transition": "0x0", 25 | "eip658Transition": "0x0", 26 | "eip1014Transition": "0x0", 27 | "eip1052Transition": "0x0", 28 | "eip1283Transition": "0x0", 29 | "gasLimitBoundDivisor": "0x400", 30 | "homesteadTransition": "0x0", 31 | "kip4Transition": "0xffffffffffffffff", 32 | "kip6Transition": "0xffffffffffffffff", 33 | "maxCodeSize": "0x6000", 34 | "maxCodeSizeTransition": "0x0", 35 | "maximumExtraDataSize": "0x320", 36 | "minGasLimit": "0x1388", 37 | "networkID": "0x102021", 38 | "validateReceipts": false, 39 | "validateReceiptsTransition": "0xffffffffffffffff", 40 | "wasmActivationTransition": "0xffffffffffffffff" 41 | }, 42 | "genesis": { 43 | "seal": { 44 | "ethereum": { 45 | "nonce": "0x0000000000000000", 46 | "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" 47 | } 48 | }, 49 | "author": "0x0000000000000000000000000000000000000000", 50 | "difficulty": "0x1", 51 | "extraData": "", 52 | "gasLimit": "0xa00000", 53 | "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 54 | "timestamp": "0x5bdda800" 55 | }, 56 | "nodes": [], 57 | "accounts": { 58 | "0x0000000000000000000000000000000000000000": { 59 | "balance": "0x1" 60 | }, 61 | "0x0000000000000000000000000000000000000001": { 62 | "balance": "0x1", 63 | "builtin": { 64 | "name": "ecrecover", 65 | "pricing": { 66 | "linear": { 67 | "base": 3000, 68 | "word": 0 69 | } 70 | } 71 | } 72 | }, 73 | "0x0000000000000000000000000000000000000002": { 74 | "balance": "0x1", 75 | "builtin": { 76 | "name": "sha256", 77 | "pricing": { 78 | "linear": { 79 | "base": 60, 80 | "word": 12 81 | } 82 | } 83 | } 84 | }, 85 | "0x0000000000000000000000000000000000000003": { 86 | "balance": "0x1", 87 | "builtin": { 88 | "name": "ripemd160", 89 | "pricing": { 90 | "linear": { 91 | "base": 600, 92 | "word": 120 93 | } 94 | } 95 | } 96 | }, 97 | "0x0000000000000000000000000000000000000004": { 98 | "balance": "0x1", 99 | "builtin": { 100 | "name": "identity", 101 | "pricing": { 102 | "linear": { 103 | "base": 15, 104 | "word": 3 105 | } 106 | } 107 | } 108 | }, 109 | "0x0000000000000000000000000000000000000005": { 110 | "balance": "0x1", 111 | "builtin": { 112 | "name": "modexp", 113 | "activate_at": "0x0", 114 | "pricing": { 115 | "modexp": { 116 | "divisor": 20 117 | } 118 | } 119 | } 120 | }, 121 | "0x0000000000000000000000000000000000000006": { 122 | "balance": "0x1", 123 | "builtin": { 124 | "name": "alt_bn128_add", 125 | "activate_at": "0x0", 126 | "pricing": { 127 | "linear": { 128 | "base": 500, 129 | "word": 0 130 | } 131 | } 132 | } 133 | }, 134 | "0x0000000000000000000000000000000000000007": { 135 | "balance": "0x1", 136 | "builtin": { 137 | "name": "alt_bn128_mul", 138 | "activate_at": "0x0", 139 | "pricing": { 140 | "linear": { 141 | "base": 40000, 142 | "word": 0 143 | } 144 | } 145 | } 146 | }, 147 | "0x0000000000000000000000000000000000000008": { 148 | "balance": "0x1", 149 | "builtin": { 150 | "name": "alt_bn128_pairing", 151 | "activate_at": "0x0", 152 | "pricing": { 153 | "alt_bn128_pairing": { 154 | "base": 100000, 155 | "pair": 80000 156 | } 157 | } 158 | } 159 | }, 160 | "0x0000000000000000000000000000000000000009": { 161 | "balance": "0x1" 162 | }, 163 | "0x000000000000000000000000000000000000000a": { 164 | "balance": "0x1" 165 | }, 166 | "0x000000000000000000000000000000000000000b": { 167 | "balance": "0x1" 168 | }, 169 | "0x000000000000000000000000000000000000000c": { 170 | "balance": "0x1" 171 | }, 172 | "0x000000000000000000000000000000000000000d": { 173 | "balance": "0x1" 174 | }, 175 | "0x000000000000000000000000000000000000000e": { 176 | "balance": "0x1" 177 | }, 178 | "0x000000000000000000000000000000000000000f": { 179 | "balance": "0x1" 180 | }, 181 | "0x0000000000000000000000000000000000000010": { 182 | "balance": "0x1" 183 | }, 184 | "0x0000000000000000000000000000000000000011": { 185 | "balance": "0x1" 186 | }, 187 | "0x0000000000000000000000000000000000000012": { 188 | "balance": "0x1" 189 | }, 190 | "0x0000000000000000000000000000000000000013": { 191 | "balance": "0x1" 192 | }, 193 | "0x0000000000000000000000000000000000000014": { 194 | "balance": "0x1" 195 | }, 196 | "0x0000000000000000000000000000000000000015": { 197 | "balance": "0x1" 198 | }, 199 | "0x0000000000000000000000000000000000000016": { 200 | "balance": "0x1" 201 | }, 202 | "0x0000000000000000000000000000000000000017": { 203 | "balance": "0x1" 204 | }, 205 | "0x0000000000000000000000000000000000000018": { 206 | "balance": "0x1" 207 | }, 208 | "0x0000000000000000000000000000000000000019": { 209 | "balance": "0x1" 210 | }, 211 | "0x000000000000000000000000000000000000001a": { 212 | "balance": "0x1" 213 | }, 214 | "0x000000000000000000000000000000000000001b": { 215 | "balance": "0x1" 216 | }, 217 | "0x000000000000000000000000000000000000001c": { 218 | "balance": "0x1" 219 | }, 220 | "0x000000000000000000000000000000000000001d": { 221 | "balance": "0x1" 222 | }, 223 | "0x000000000000000000000000000000000000001e": { 224 | "balance": "0x1" 225 | }, 226 | "0x000000000000000000000000000000000000001f": { 227 | "balance": "0x1" 228 | }, 229 | "0x0000000000000000000000000000000000000020": { 230 | "balance": "0x1" 231 | }, 232 | "0x0000000000000000000000000000000000000021": { 233 | "balance": "0x1" 234 | }, 235 | "0x0000000000000000000000000000000000000022": { 236 | "balance": "0x1" 237 | }, 238 | "0x0000000000000000000000000000000000000023": { 239 | "balance": "0x1" 240 | }, 241 | "0x0000000000000000000000000000000000000024": { 242 | "balance": "0x1" 243 | }, 244 | "0x0000000000000000000000000000000000000025": { 245 | "balance": "0x1" 246 | }, 247 | "0x0000000000000000000000000000000000000026": { 248 | "balance": "0x1" 249 | }, 250 | "0x0000000000000000000000000000000000000027": { 251 | "balance": "0x1" 252 | }, 253 | "0x0000000000000000000000000000000000000028": { 254 | "balance": "0x1" 255 | }, 256 | "0x0000000000000000000000000000000000000029": { 257 | "balance": "0x1" 258 | }, 259 | "0x000000000000000000000000000000000000002a": { 260 | "balance": "0x1" 261 | }, 262 | "0x000000000000000000000000000000000000002b": { 263 | "balance": "0x1" 264 | }, 265 | "0x000000000000000000000000000000000000002c": { 266 | "balance": "0x1" 267 | }, 268 | "0x000000000000000000000000000000000000002d": { 269 | "balance": "0x1" 270 | }, 271 | "0x000000000000000000000000000000000000002e": { 272 | "balance": "0x1" 273 | }, 274 | "0x000000000000000000000000000000000000002f": { 275 | "balance": "0x1" 276 | }, 277 | "0x0000000000000000000000000000000000000030": { 278 | "balance": "0x1" 279 | }, 280 | "0x0000000000000000000000000000000000000031": { 281 | "balance": "0x1" 282 | }, 283 | "0x0000000000000000000000000000000000000032": { 284 | "balance": "0x1" 285 | }, 286 | "0x0000000000000000000000000000000000000033": { 287 | "balance": "0x1" 288 | }, 289 | "0x0000000000000000000000000000000000000034": { 290 | "balance": "0x1" 291 | }, 292 | "0x0000000000000000000000000000000000000035": { 293 | "balance": "0x1" 294 | }, 295 | "0x0000000000000000000000000000000000000036": { 296 | "balance": "0x1" 297 | }, 298 | "0x0000000000000000000000000000000000000037": { 299 | "balance": "0x1" 300 | }, 301 | "0x0000000000000000000000000000000000000038": { 302 | "balance": "0x1" 303 | }, 304 | "0x0000000000000000000000000000000000000039": { 305 | "balance": "0x1" 306 | }, 307 | "0x000000000000000000000000000000000000003a": { 308 | "balance": "0x1" 309 | }, 310 | "0x000000000000000000000000000000000000003b": { 311 | "balance": "0x1" 312 | }, 313 | "0x000000000000000000000000000000000000003c": { 314 | "balance": "0x1" 315 | }, 316 | "0x000000000000000000000000000000000000003d": { 317 | "balance": "0x1" 318 | }, 319 | "0x000000000000000000000000000000000000003e": { 320 | "balance": "0x1" 321 | }, 322 | "0x000000000000000000000000000000000000003f": { 323 | "balance": "0x1" 324 | }, 325 | "0x0000000000000000000000000000000000000040": { 326 | "balance": "0x1" 327 | }, 328 | "0x0000000000000000000000000000000000000041": { 329 | "balance": "0x1" 330 | }, 331 | "0x0000000000000000000000000000000000000042": { 332 | "balance": "0x1" 333 | }, 334 | "0x0000000000000000000000000000000000000043": { 335 | "balance": "0x1" 336 | }, 337 | "0x0000000000000000000000000000000000000044": { 338 | "balance": "0x1" 339 | }, 340 | "0x0000000000000000000000000000000000000045": { 341 | "balance": "0x1" 342 | }, 343 | "0x0000000000000000000000000000000000000046": { 344 | "balance": "0x1" 345 | }, 346 | "0x0000000000000000000000000000000000000047": { 347 | "balance": "0x1" 348 | }, 349 | "0x0000000000000000000000000000000000000048": { 350 | "balance": "0x1" 351 | }, 352 | "0x0000000000000000000000000000000000000049": { 353 | "balance": "0x1" 354 | }, 355 | "0x000000000000000000000000000000000000004a": { 356 | "balance": "0x1" 357 | }, 358 | "0x000000000000000000000000000000000000004b": { 359 | "balance": "0x1" 360 | }, 361 | "0x000000000000000000000000000000000000004c": { 362 | "balance": "0x1" 363 | }, 364 | "0x000000000000000000000000000000000000004d": { 365 | "balance": "0x1" 366 | }, 367 | "0x000000000000000000000000000000000000004e": { 368 | "balance": "0x1" 369 | }, 370 | "0x000000000000000000000000000000000000004f": { 371 | "balance": "0x1" 372 | }, 373 | "0x0000000000000000000000000000000000000050": { 374 | "balance": "0x1" 375 | }, 376 | "0x0000000000000000000000000000000000000051": { 377 | "balance": "0x1" 378 | }, 379 | "0x0000000000000000000000000000000000000052": { 380 | "balance": "0x1" 381 | }, 382 | "0x0000000000000000000000000000000000000053": { 383 | "balance": "0x1" 384 | }, 385 | "0x0000000000000000000000000000000000000054": { 386 | "balance": "0x1" 387 | }, 388 | "0x0000000000000000000000000000000000000055": { 389 | "balance": "0x1" 390 | }, 391 | "0x0000000000000000000000000000000000000056": { 392 | "balance": "0x1" 393 | }, 394 | "0x0000000000000000000000000000000000000057": { 395 | "balance": "0x1" 396 | }, 397 | "0x0000000000000000000000000000000000000058": { 398 | "balance": "0x1" 399 | }, 400 | "0x0000000000000000000000000000000000000059": { 401 | "balance": "0x1" 402 | }, 403 | "0x000000000000000000000000000000000000005a": { 404 | "balance": "0x1" 405 | }, 406 | "0x000000000000000000000000000000000000005b": { 407 | "balance": "0x1" 408 | }, 409 | "0x000000000000000000000000000000000000005c": { 410 | "balance": "0x1" 411 | }, 412 | "0x000000000000000000000000000000000000005d": { 413 | "balance": "0x1" 414 | }, 415 | "0x000000000000000000000000000000000000005e": { 416 | "balance": "0x1" 417 | }, 418 | "0x000000000000000000000000000000000000005f": { 419 | "balance": "0x1" 420 | }, 421 | "0x0000000000000000000000000000000000000060": { 422 | "balance": "0x1" 423 | }, 424 | "0x0000000000000000000000000000000000000061": { 425 | "balance": "0x1" 426 | }, 427 | "0x0000000000000000000000000000000000000062": { 428 | "balance": "0x1" 429 | }, 430 | "0x0000000000000000000000000000000000000063": { 431 | "balance": "0x1" 432 | }, 433 | "0x0000000000000000000000000000000000000064": { 434 | "balance": "0x1" 435 | }, 436 | "0x0000000000000000000000000000000000000065": { 437 | "balance": "0x1" 438 | }, 439 | "0x0000000000000000000000000000000000000066": { 440 | "balance": "0x1" 441 | }, 442 | "0x0000000000000000000000000000000000000067": { 443 | "balance": "0x1" 444 | }, 445 | "0x0000000000000000000000000000000000000068": { 446 | "balance": "0x1" 447 | }, 448 | "0x0000000000000000000000000000000000000069": { 449 | "balance": "0x1" 450 | }, 451 | "0x000000000000000000000000000000000000006a": { 452 | "balance": "0x1" 453 | }, 454 | "0x000000000000000000000000000000000000006b": { 455 | "balance": "0x1" 456 | }, 457 | "0x000000000000000000000000000000000000006c": { 458 | "balance": "0x1" 459 | }, 460 | "0x000000000000000000000000000000000000006d": { 461 | "balance": "0x1" 462 | }, 463 | "0x000000000000000000000000000000000000006e": { 464 | "balance": "0x1" 465 | }, 466 | "0x000000000000000000000000000000000000006f": { 467 | "balance": "0x1" 468 | }, 469 | "0x0000000000000000000000000000000000000070": { 470 | "balance": "0x1" 471 | }, 472 | "0x0000000000000000000000000000000000000071": { 473 | "balance": "0x1" 474 | }, 475 | "0x0000000000000000000000000000000000000072": { 476 | "balance": "0x1" 477 | }, 478 | "0x0000000000000000000000000000000000000073": { 479 | "balance": "0x1" 480 | }, 481 | "0x0000000000000000000000000000000000000074": { 482 | "balance": "0x1" 483 | }, 484 | "0x0000000000000000000000000000000000000075": { 485 | "balance": "0x1" 486 | }, 487 | "0x0000000000000000000000000000000000000076": { 488 | "balance": "0x1" 489 | }, 490 | "0x0000000000000000000000000000000000000077": { 491 | "balance": "0x1" 492 | }, 493 | "0x0000000000000000000000000000000000000078": { 494 | "balance": "0x1" 495 | }, 496 | "0x0000000000000000000000000000000000000079": { 497 | "balance": "0x1" 498 | }, 499 | "0x000000000000000000000000000000000000007a": { 500 | "balance": "0x1" 501 | }, 502 | "0x000000000000000000000000000000000000007b": { 503 | "balance": "0x1" 504 | }, 505 | "0x000000000000000000000000000000000000007c": { 506 | "balance": "0x1" 507 | }, 508 | "0x000000000000000000000000000000000000007d": { 509 | "balance": "0x1" 510 | }, 511 | "0x000000000000000000000000000000000000007e": { 512 | "balance": "0x1" 513 | }, 514 | "0x000000000000000000000000000000000000007f": { 515 | "balance": "0x1" 516 | }, 517 | "0x0000000000000000000000000000000000000080": { 518 | "balance": "0x1" 519 | }, 520 | "0x0000000000000000000000000000000000000081": { 521 | "balance": "0x1" 522 | }, 523 | "0x0000000000000000000000000000000000000082": { 524 | "balance": "0x1" 525 | }, 526 | "0x0000000000000000000000000000000000000083": { 527 | "balance": "0x1" 528 | }, 529 | "0x0000000000000000000000000000000000000084": { 530 | "balance": "0x1" 531 | }, 532 | "0x0000000000000000000000000000000000000085": { 533 | "balance": "0x1" 534 | }, 535 | "0x0000000000000000000000000000000000000086": { 536 | "balance": "0x1" 537 | }, 538 | "0x0000000000000000000000000000000000000087": { 539 | "balance": "0x1" 540 | }, 541 | "0x0000000000000000000000000000000000000088": { 542 | "balance": "0x1" 543 | }, 544 | "0x0000000000000000000000000000000000000089": { 545 | "balance": "0x1" 546 | }, 547 | "0x000000000000000000000000000000000000008a": { 548 | "balance": "0x1" 549 | }, 550 | "0x000000000000000000000000000000000000008b": { 551 | "balance": "0x1" 552 | }, 553 | "0x000000000000000000000000000000000000008c": { 554 | "balance": "0x1" 555 | }, 556 | "0x000000000000000000000000000000000000008d": { 557 | "balance": "0x1" 558 | }, 559 | "0x000000000000000000000000000000000000008e": { 560 | "balance": "0x1" 561 | }, 562 | "0x000000000000000000000000000000000000008f": { 563 | "balance": "0x1" 564 | }, 565 | "0x0000000000000000000000000000000000000090": { 566 | "balance": "0x1" 567 | }, 568 | "0x0000000000000000000000000000000000000091": { 569 | "balance": "0x1" 570 | }, 571 | "0x0000000000000000000000000000000000000092": { 572 | "balance": "0x1" 573 | }, 574 | "0x0000000000000000000000000000000000000093": { 575 | "balance": "0x1" 576 | }, 577 | "0x0000000000000000000000000000000000000094": { 578 | "balance": "0x1" 579 | }, 580 | "0x0000000000000000000000000000000000000095": { 581 | "balance": "0x1" 582 | }, 583 | "0x0000000000000000000000000000000000000096": { 584 | "balance": "0x1" 585 | }, 586 | "0x0000000000000000000000000000000000000097": { 587 | "balance": "0x1" 588 | }, 589 | "0x0000000000000000000000000000000000000098": { 590 | "balance": "0x1" 591 | }, 592 | "0x0000000000000000000000000000000000000099": { 593 | "balance": "0x1" 594 | }, 595 | "0x000000000000000000000000000000000000009a": { 596 | "balance": "0x1" 597 | }, 598 | "0x000000000000000000000000000000000000009b": { 599 | "balance": "0x1" 600 | }, 601 | "0x000000000000000000000000000000000000009c": { 602 | "balance": "0x1" 603 | }, 604 | "0x000000000000000000000000000000000000009d": { 605 | "balance": "0x1" 606 | }, 607 | "0x000000000000000000000000000000000000009e": { 608 | "balance": "0x1" 609 | }, 610 | "0x000000000000000000000000000000000000009f": { 611 | "balance": "0x1" 612 | }, 613 | "0x00000000000000000000000000000000000000a0": { 614 | "balance": "0x1" 615 | }, 616 | "0x00000000000000000000000000000000000000a1": { 617 | "balance": "0x1" 618 | }, 619 | "0x00000000000000000000000000000000000000a2": { 620 | "balance": "0x1" 621 | }, 622 | "0x00000000000000000000000000000000000000a3": { 623 | "balance": "0x1" 624 | }, 625 | "0x00000000000000000000000000000000000000a4": { 626 | "balance": "0x1" 627 | }, 628 | "0x00000000000000000000000000000000000000a5": { 629 | "balance": "0x1" 630 | }, 631 | "0x00000000000000000000000000000000000000a6": { 632 | "balance": "0x1" 633 | }, 634 | "0x00000000000000000000000000000000000000a7": { 635 | "balance": "0x1" 636 | }, 637 | "0x00000000000000000000000000000000000000a8": { 638 | "balance": "0x1" 639 | }, 640 | "0x00000000000000000000000000000000000000a9": { 641 | "balance": "0x1" 642 | }, 643 | "0x00000000000000000000000000000000000000aa": { 644 | "balance": "0x1" 645 | }, 646 | "0x00000000000000000000000000000000000000ab": { 647 | "balance": "0x1" 648 | }, 649 | "0x00000000000000000000000000000000000000ac": { 650 | "balance": "0x1" 651 | }, 652 | "0x00000000000000000000000000000000000000ad": { 653 | "balance": "0x1" 654 | }, 655 | "0x00000000000000000000000000000000000000ae": { 656 | "balance": "0x1" 657 | }, 658 | "0x00000000000000000000000000000000000000af": { 659 | "balance": "0x1" 660 | }, 661 | "0x00000000000000000000000000000000000000b0": { 662 | "balance": "0x1" 663 | }, 664 | "0x00000000000000000000000000000000000000b1": { 665 | "balance": "0x1" 666 | }, 667 | "0x00000000000000000000000000000000000000b2": { 668 | "balance": "0x1" 669 | }, 670 | "0x00000000000000000000000000000000000000b3": { 671 | "balance": "0x1" 672 | }, 673 | "0x00000000000000000000000000000000000000b4": { 674 | "balance": "0x1" 675 | }, 676 | "0x00000000000000000000000000000000000000b5": { 677 | "balance": "0x1" 678 | }, 679 | "0x00000000000000000000000000000000000000b6": { 680 | "balance": "0x1" 681 | }, 682 | "0x00000000000000000000000000000000000000b7": { 683 | "balance": "0x1" 684 | }, 685 | "0x00000000000000000000000000000000000000b8": { 686 | "balance": "0x1" 687 | }, 688 | "0x00000000000000000000000000000000000000b9": { 689 | "balance": "0x1" 690 | }, 691 | "0x00000000000000000000000000000000000000ba": { 692 | "balance": "0x1" 693 | }, 694 | "0x00000000000000000000000000000000000000bb": { 695 | "balance": "0x1" 696 | }, 697 | "0x00000000000000000000000000000000000000bc": { 698 | "balance": "0x1" 699 | }, 700 | "0x00000000000000000000000000000000000000bd": { 701 | "balance": "0x1" 702 | }, 703 | "0x00000000000000000000000000000000000000be": { 704 | "balance": "0x1" 705 | }, 706 | "0x00000000000000000000000000000000000000bf": { 707 | "balance": "0x1" 708 | }, 709 | "0x00000000000000000000000000000000000000c0": { 710 | "balance": "0x1" 711 | }, 712 | "0x00000000000000000000000000000000000000c1": { 713 | "balance": "0x1" 714 | }, 715 | "0x00000000000000000000000000000000000000c2": { 716 | "balance": "0x1" 717 | }, 718 | "0x00000000000000000000000000000000000000c3": { 719 | "balance": "0x1" 720 | }, 721 | "0x00000000000000000000000000000000000000c4": { 722 | "balance": "0x1" 723 | }, 724 | "0x00000000000000000000000000000000000000c5": { 725 | "balance": "0x1" 726 | }, 727 | "0x00000000000000000000000000000000000000c6": { 728 | "balance": "0x1" 729 | }, 730 | "0x00000000000000000000000000000000000000c7": { 731 | "balance": "0x1" 732 | }, 733 | "0x00000000000000000000000000000000000000c8": { 734 | "balance": "0x1" 735 | }, 736 | "0x00000000000000000000000000000000000000c9": { 737 | "balance": "0x1" 738 | }, 739 | "0x00000000000000000000000000000000000000ca": { 740 | "balance": "0x1" 741 | }, 742 | "0x00000000000000000000000000000000000000cb": { 743 | "balance": "0x1" 744 | }, 745 | "0x00000000000000000000000000000000000000cc": { 746 | "balance": "0x1" 747 | }, 748 | "0x00000000000000000000000000000000000000cd": { 749 | "balance": "0x1" 750 | }, 751 | "0x00000000000000000000000000000000000000ce": { 752 | "balance": "0x1" 753 | }, 754 | "0x00000000000000000000000000000000000000cf": { 755 | "balance": "0x1" 756 | }, 757 | "0x00000000000000000000000000000000000000d0": { 758 | "balance": "0x1" 759 | }, 760 | "0x00000000000000000000000000000000000000d1": { 761 | "balance": "0x1" 762 | }, 763 | "0x00000000000000000000000000000000000000d2": { 764 | "balance": "0x1" 765 | }, 766 | "0x00000000000000000000000000000000000000d3": { 767 | "balance": "0x1" 768 | }, 769 | "0x00000000000000000000000000000000000000d4": { 770 | "balance": "0x1" 771 | }, 772 | "0x00000000000000000000000000000000000000d5": { 773 | "balance": "0x1" 774 | }, 775 | "0x00000000000000000000000000000000000000d6": { 776 | "balance": "0x1" 777 | }, 778 | "0x00000000000000000000000000000000000000d7": { 779 | "balance": "0x1" 780 | }, 781 | "0x00000000000000000000000000000000000000d8": { 782 | "balance": "0x1" 783 | }, 784 | "0x00000000000000000000000000000000000000d9": { 785 | "balance": "0x1" 786 | }, 787 | "0x00000000000000000000000000000000000000da": { 788 | "balance": "0x1" 789 | }, 790 | "0x00000000000000000000000000000000000000db": { 791 | "balance": "0x1" 792 | }, 793 | "0x00000000000000000000000000000000000000dc": { 794 | "balance": "0x1" 795 | }, 796 | "0x00000000000000000000000000000000000000dd": { 797 | "balance": "0x1" 798 | }, 799 | "0x00000000000000000000000000000000000000de": { 800 | "balance": "0x1" 801 | }, 802 | "0x00000000000000000000000000000000000000df": { 803 | "balance": "0x1" 804 | }, 805 | "0x00000000000000000000000000000000000000e0": { 806 | "balance": "0x1" 807 | }, 808 | "0x00000000000000000000000000000000000000e1": { 809 | "balance": "0x1" 810 | }, 811 | "0x00000000000000000000000000000000000000e2": { 812 | "balance": "0x1" 813 | }, 814 | "0x00000000000000000000000000000000000000e3": { 815 | "balance": "0x1" 816 | }, 817 | "0x00000000000000000000000000000000000000e4": { 818 | "balance": "0x1" 819 | }, 820 | "0x00000000000000000000000000000000000000e5": { 821 | "balance": "0x1" 822 | }, 823 | "0x00000000000000000000000000000000000000e6": { 824 | "balance": "0x1" 825 | }, 826 | "0x00000000000000000000000000000000000000e7": { 827 | "balance": "0x1" 828 | }, 829 | "0x00000000000000000000000000000000000000e8": { 830 | "balance": "0x1" 831 | }, 832 | "0x00000000000000000000000000000000000000e9": { 833 | "balance": "0x1" 834 | }, 835 | "0x00000000000000000000000000000000000000ea": { 836 | "balance": "0x1" 837 | }, 838 | "0x00000000000000000000000000000000000000eb": { 839 | "balance": "0x1" 840 | }, 841 | "0x00000000000000000000000000000000000000ec": { 842 | "balance": "0x1" 843 | }, 844 | "0x00000000000000000000000000000000000000ed": { 845 | "balance": "0x1" 846 | }, 847 | "0x00000000000000000000000000000000000000ee": { 848 | "balance": "0x1" 849 | }, 850 | "0x00000000000000000000000000000000000000ef": { 851 | "balance": "0x1" 852 | }, 853 | "0x00000000000000000000000000000000000000f0": { 854 | "balance": "0x1" 855 | }, 856 | "0x00000000000000000000000000000000000000f1": { 857 | "balance": "0x1" 858 | }, 859 | "0x00000000000000000000000000000000000000f2": { 860 | "balance": "0x1" 861 | }, 862 | "0x00000000000000000000000000000000000000f3": { 863 | "balance": "0x1" 864 | }, 865 | "0x00000000000000000000000000000000000000f4": { 866 | "balance": "0x1" 867 | }, 868 | "0x00000000000000000000000000000000000000f5": { 869 | "balance": "0x1" 870 | }, 871 | "0x00000000000000000000000000000000000000f6": { 872 | "balance": "0x1" 873 | }, 874 | "0x00000000000000000000000000000000000000f7": { 875 | "balance": "0x1" 876 | }, 877 | "0x00000000000000000000000000000000000000f8": { 878 | "balance": "0x1" 879 | }, 880 | "0x00000000000000000000000000000000000000f9": { 881 | "balance": "0x1" 882 | }, 883 | "0x00000000000000000000000000000000000000fa": { 884 | "balance": "0x1" 885 | }, 886 | "0x00000000000000000000000000000000000000fb": { 887 | "balance": "0x1" 888 | }, 889 | "0x00000000000000000000000000000000000000fc": { 890 | "balance": "0x1" 891 | }, 892 | "0x00000000000000000000000000000000000000fd": { 893 | "balance": "0x1" 894 | }, 895 | "0x00000000000000000000000000000000000000fe": { 896 | "balance": "0x1" 897 | }, 898 | "0x00000000000000000000000000000000000000ff": { 899 | "balance": "0x1" 900 | }, 901 | "0x009fcc115ad9ef38288a82a014dea30f63a84383": { 902 | "balance": "0x100000000000000000000000000000000000000000000000000" 903 | }, 904 | "0x0015c90d0e12186bc51c9d51aff4d3fb6e984291": { 905 | "balance": "0x100000000000000000000000000000000000000000000000000" 906 | } 907 | } 908 | } 909 | -------------------------------------------------------------------------------- /discovery-provider/dev.env: -------------------------------------------------------------------------------- 1 | # DO NOT MODIFY these values, use `audius-cli get-config creator-node` for accurate values 2 | 3 | audius_discprov_url= 4 | audius_delegate_owner_wallet= 5 | audius_delegate_private_key= 6 | 7 | audius_redis_url="redis://cache:6379/00" 8 | audius_db_url="postgresql://postgres:postgres@db:5432/audius_discovery" 9 | audius_db_url_read_replica="postgresql://postgres:postgres@db:5432/audius_discovery" 10 | audius_contracts_registry="0xABbfF712977dB51f9f212B85e8A4904c818C2b63" 11 | audius_contracts_entity_manager_address="0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B" 12 | audius_contracts_nethermind_entity_manager_address="0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B" 13 | audius_cors_allow_all="true" 14 | AUDIUS_IS_STAGING="false" 15 | audius_aao_endpoint="https://anti-abuse.devnet.audius-d" 16 | audius_discprov_blacklist_block_processing_window=1200 17 | audius_discprov_block_processing_window=100 18 | audius_discprov_env="devnet" 19 | audius_discprov_get_users_cnode_ttl_sec=300 20 | audius_discprov_identity_service_url="https://identity.devnet.audius-d" 21 | audius_discprov_notifications_max_block_diff=10 22 | audius_discprov_user_metadata_service_url="https://creator-1.devnet.audius-d" 23 | audius_elasticsearch_search_enabled="true" 24 | audius_elasticsearch_url="http://elasticsearch:9200" 25 | audius_enable_rsyslog="false" 26 | audius_eth_contracts_registry="0xABbfF712977dB51f9f212B85e8A4904c818C2b63" 27 | audius_gunicorn_worker_class="eventlet" 28 | audius_gunicorn_workers=16 29 | audius_openresty_enable="true" 30 | audius_solana_endpoint="http://solana-test-validator.devnet.audius-d" 31 | audius_solana_rewards_manager_account="DJPzVothq58SmkpRb1ATn5ddN2Rpv1j2TcGvM3XsHf1c" 32 | audius_solana_rewards_manager_min_slot=0 33 | audius_solana_rewards_manager_program_address="testLsJKtyABc9UXJF8JWFKf1YH4LmqCWBC42c6akPb" 34 | audius_solana_signer_group_address="HwecRT7whduwiLhJXiWmvrhcCh8zJhwJ4B9fXniPUDyz" 35 | audius_solana_track_listen_count_address="testEjzEibm3nq77VQcqCCmSMx6m3KdJHuepBH1rnue" 36 | audius_solana_usdc_mint="26Q7gP8UfkDzi7GMFEQxTJaNJ8D2ybCUjex58M5MLu8y" 37 | audius_solana_user_bank_min_slot=0 38 | audius_solana_user_bank_program_address="testHKV1B56fbvop4w6f2cTGEub9dRQ2Euta5VmqdX9" 39 | audius_solana_waudio_mint="37RCjhgV1qGV2Q54EHFScdxZ22ydRMdKMtVgod47fDP3" 40 | audius_use_aao="false" 41 | audius_web3_eth_provider_url="http://eth-ganache.devnet.audius-d" 42 | audius_web3_host="http://acdc-ganache.devnet.audius-d" 43 | audius_web3_localhost="http://acdc-ganache.devnet.audius-d" 44 | audius_web3_port=443 45 | 46 | audius_static_nodes="" 47 | audius_genesis_signers="" 48 | -------------------------------------------------------------------------------- /discovery-provider/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | # used by audius-d devnet 4 | x-extra-hosts: &extra-hosts 5 | extra_hosts: 6 | - "creator-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 7 | - "discovery-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 8 | - "identity.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 9 | - "eth-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 10 | - "acdc-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 11 | - "solana-test-validator.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 12 | 13 | services: 14 | caddy: 15 | image: audius/caddy:2.7.4 16 | container_name: caddy 17 | <<: *extra-hosts 18 | restart: unless-stopped 19 | env_file: 20 | - ${OVERRIDE_PATH:-override.env} 21 | networks: 22 | - discovery-provider-network 23 | ports: 24 | - 80:80 25 | - 443:443 26 | volumes: 27 | - ./Caddyfile:/etc/caddy/Caddyfile 28 | - caddy_data:/data 29 | - caddy_config:/config 30 | profiles: 31 | - discovery 32 | 33 | openresty: 34 | image: audius/discovery-provider-openresty:${TAG:-current} 35 | container_name: openresty 36 | <<: *extra-hosts 37 | restart: unless-stopped 38 | env_file: 39 | - ${OVERRIDE_PATH:-override.env} 40 | networks: 41 | - discovery-provider-network 42 | ports: 43 | - "5000:5000" 44 | profiles: 45 | - discovery 46 | 47 | core: 48 | container_name: core 49 | image: audius/audiusd:${TAG:-current} 50 | pull_policy: always 51 | restart: unless-stopped 52 | ports: 53 | - "5001:80" # echo server (proxy for core + uptime) 54 | - "26656:26656" # CometBFT P2P Server 55 | - "26657:26657" # CometBFT RPC Server 56 | - "26659:26659" # Console UI 57 | - "50051:50051" # Core GRPC Server 58 | mem_limit: 2g 59 | cpus: 2 60 | volumes: 61 | - /var/k8s/bolt:/bolt 62 | - /var/k8s/bolt:/audius-core 63 | env_file: 64 | - ${NETWORK:-prod}.env 65 | - ${OVERRIDE_PATH:-override.env} 66 | environment: 67 | - AUDIUSD_CORE_ONLY=true 68 | - AUDIUSD_TLS_DISABLED=true 69 | networks: 70 | - discovery-provider-network 71 | logging: 72 | options: 73 | max-size: 10m 74 | max-file: 3 75 | mode: non-blocking 76 | max-buffer-size: 100m 77 | driver: json-file 78 | depends_on: 79 | db: 80 | condition: service_healthy 81 | profiles: 82 | - discovery 83 | 84 | comms: 85 | image: audius/comms:${TAG:-current} 86 | container_name: comms 87 | command: comms discovery 88 | <<: *extra-hosts 89 | restart: unless-stopped 90 | networks: 91 | - discovery-provider-network 92 | env_file: 93 | - ${NETWORK:-prod}.env 94 | - ${OVERRIDE_PATH:-override.env} 95 | logging: 96 | options: 97 | max-size: 10m 98 | max-file: 3 99 | mode: non-blocking 100 | max-buffer-size: 100m 101 | driver: json-file 102 | profiles: 103 | - discovery 104 | 105 | db: 106 | container_name: postgres 107 | image: postgres:15.5 108 | shm_size: 2g 109 | restart: always 110 | entrypoint: > 111 | /bin/bash -c 112 | "if [ -f /var/lib/postgresql/data/pg_hba.conf ]; then 113 | if [[ $$(tail -n 1 /var/lib/postgresql/data/pg_hba.conf) != 'hostnossl all all 0.0.0.0/0 trust' ]]; then 114 | echo 'hostnossl all all 0.0.0.0/0 trust' >> /var/lib/postgresql/data/pg_hba.conf; 115 | fi; 116 | fi; 117 | /usr/local/bin/docker-entrypoint.sh postgres -c shared_buffers=2GB -c max_connections=500 -c shared_preload_libraries=pg_stat_statements -c listen_addresses='*'" 118 | healthcheck: 119 | test: ['CMD', 'pg_isready', '-U', 'postgres'] 120 | interval: 10s 121 | timeout: 5s 122 | environment: 123 | POSTGRES_USER: postgres 124 | POSTGRES_PASSWORD: postgres 125 | POSTGRES_DB: audius_discovery 126 | logging: 127 | options: 128 | max-size: 10m 129 | max-file: 3 130 | mode: non-blocking 131 | max-buffer-size: 100m 132 | driver: json-file 133 | volumes: 134 | - /var/k8s/discovery-provider-db:/var/lib/postgresql/data 135 | networks: 136 | - discovery-provider-network 137 | profiles: 138 | - discovery 139 | 140 | backend: 141 | container_name: server 142 | image: audius/discovery-provider:${TAG:-current} 143 | pull_policy: always 144 | <<: *extra-hosts 145 | restart: always 146 | mem_limit: ${SERVER_MEM_LIMIT:-5000000000} 147 | healthcheck: 148 | test: [ 149 | "CMD-SHELL", 150 | "pgrep pg_migrate || curl -f http://localhost:5000/health_check?bypass_errors=true || exit 1" 151 | ] 152 | depends_on: 153 | db: 154 | condition: service_healthy 155 | cache: 156 | condition: service_healthy 157 | elasticsearch: 158 | condition: service_healthy 159 | indexer: 160 | condition: service_healthy 161 | labels: 162 | autoheal: "true" 163 | env_file: 164 | - ${NETWORK:-prod}.env 165 | - ${OVERRIDE_PATH:-override.env} 166 | environment: 167 | - audius_discprov_infra_setup=audius-docker-compose 168 | - audius_no_workers=true 169 | - audius_db_run_migrations=false 170 | - audius_elasticsearch_run_indexer=false 171 | networks: 172 | - discovery-provider-network 173 | profiles: 174 | - discovery 175 | 176 | indexer: 177 | container_name: indexer 178 | image: audius/discovery-provider:${TAG:-current} 179 | pull_policy: always 180 | <<: *extra-hosts 181 | restart: always 182 | mem_limit: ${INDEXER_MEM_LIMIT:-5000000000} 183 | depends_on: 184 | db: 185 | condition: service_healthy 186 | cache: 187 | condition: service_healthy 188 | elasticsearch: 189 | condition: service_healthy 190 | labels: 191 | autoheal: "true" 192 | env_file: 193 | - ${NETWORK:-prod}.env 194 | - ${OVERRIDE_PATH:-override.env} 195 | environment: 196 | - audius_discprov_infra_setup=audius-docker-compose 197 | - audius_no_server=true 198 | - audius_db_run_migrations=true 199 | - audius_elasticsearch_run_indexer=true 200 | healthcheck: 201 | test: > 202 | /bin/sh -c 203 | "if pgrep -af pg_migrate | grep -v 'pgrep -af pg_migrate' > /dev/null; then 204 | # Unhealthy if pg_migrate is found, excluding the pgrep command itself 205 | exit 1 206 | elif pgrep -af celery | grep -v 'pgrep -af celery' > /dev/null; then 207 | # Healthy if celery is found, excluding the pgrep command itself 208 | exit 0 209 | else 210 | # Unhealthy in all other cases 211 | exit 1 212 | fi" 213 | interval: 5s 214 | timeout: 5s 215 | retries: 12 216 | start_period: 120m 217 | networks: 218 | - discovery-provider-network 219 | profiles: 220 | - discovery 221 | 222 | cache: 223 | container_name: redis 224 | restart: always 225 | extends: 226 | file: ../common-services.yml 227 | service: base-redis 228 | networks: 229 | - discovery-provider-network 230 | profiles: 231 | - discovery 232 | 233 | elasticsearch: 234 | container_name: elasticsearch 235 | image: docker.elastic.co/elasticsearch/elasticsearch:8.1.0 236 | restart: always 237 | environment: 238 | - network.host=0.0.0.0 239 | - discovery.type=single-node 240 | - cluster.name=docker-cluster 241 | - node.name=cluster1-node1 242 | - xpack.license.self_generated.type=basic 243 | - xpack.security.enabled=false 244 | - "ES_JAVA_OPTS=-Xms${ES_MEM:-2g} -Xmx${ES_MEM:-2g}" 245 | ulimits: 246 | memlock: 247 | soft: -1 248 | hard: -1 249 | volumes: 250 | - esdata:/usr/share/elasticsearch/data 251 | networks: 252 | - discovery-provider-network 253 | healthcheck: 254 | test: 255 | [ 256 | "CMD-SHELL", 257 | "curl --silent --fail elasticsearch:9200/_cluster/health || exit 1" 258 | ] 259 | interval: 10s 260 | start_period: 40s 261 | timeout: 5s 262 | profiles: 263 | - discovery 264 | 265 | es-indexer: 266 | image: audius/es-indexer:${TAG:-current} 267 | container_name: es-indexer 268 | restart: unless-stopped 269 | networks: 270 | - discovery-provider-network 271 | env_file: 272 | - ${NETWORK:-prod}.env 273 | - ${OVERRIDE_PATH:-override.env} 274 | logging: 275 | options: 276 | max-size: 10m 277 | max-file: 3 278 | mode: non-blocking 279 | max-buffer-size: 100m 280 | driver: json-file 281 | profiles: 282 | - discovery 283 | 284 | relay: 285 | image: audius/relay:${TAG:-current} 286 | container_name: relay 287 | <<: *extra-hosts 288 | restart: unless-stopped 289 | networks: 290 | - discovery-provider-network 291 | environment: 292 | - ENVIRONMENT=${NETWORK} 293 | env_file: 294 | - ${NETWORK:-prod}.env 295 | - ${OVERRIDE_PATH:-override.env} 296 | logging: 297 | options: 298 | max-size: 10m 299 | max-file: 3 300 | mode: non-blocking 301 | max-buffer-size: 100m 302 | driver: json-file 303 | profiles: 304 | - discovery 305 | 306 | solana-relay: 307 | image: audius/solana-relay:${TAG:-current} 308 | container_name: solana-relay 309 | <<: *extra-hosts 310 | restart: unless-stopped 311 | networks: 312 | - discovery-provider-network 313 | environment: 314 | - ENVIRONMENT=${NETWORK} 315 | env_file: 316 | - ${NETWORK:-prod}.env 317 | - ${OVERRIDE_PATH:-override.env} 318 | logging: 319 | options: 320 | max-size: 10m 321 | max-file: 3 322 | mode: non-blocking 323 | max-buffer-size: 100m 324 | driver: json-file 325 | profiles: 326 | - discovery 327 | 328 | optimize-db: 329 | container_name: optimize-db 330 | image: postgres:15.5-bookworm 331 | environment: 332 | - PGPASSWORD=postgres 333 | command: > 334 | sh -c " 335 | psql -h db -U postgres -d audius_discovery -c 'VACUUM FULL;' && 336 | psql -h db -U postgres -d audius_discovery -c 'REINDEX DATABASE audius_discovery;' && 337 | psql -h db -U postgres -d audius_discovery -c 'ANALYZE;' && 338 | echo 'Database optimization completed' 339 | " 340 | networks: 341 | - discovery-provider-network 342 | profiles: 343 | - optimize-db 344 | 345 | seed: 346 | image: audius/discovery-provider:${TAG:-current} 347 | command: bash /usr/share/seed.sh ${NETWORK:-prod} 348 | env_file: 349 | - ${NETWORK:-prod}.env 350 | - ${OVERRIDE_PATH:-override.env} 351 | volumes: 352 | - ./seed.sh:/usr/share/seed.sh 353 | depends_on: 354 | db: 355 | condition: service_healthy 356 | networks: 357 | - discovery-provider-network 358 | profiles: 359 | - seed 360 | 361 | backfill-audio-analyses: 362 | image: audius/backfill-audio-analyses:${TAG:-current} 363 | container_name: backfill-audio-analyses 364 | restart: on-failure 365 | networks: 366 | - discovery-provider-network 367 | env_file: 368 | - ${NETWORK:-prod}.env 369 | - ${OVERRIDE_PATH:-override.env} 370 | logging: 371 | options: 372 | max-size: 10m 373 | max-file: 3 374 | mode: non-blocking 375 | max-buffer-size: 100m 376 | driver: json-file 377 | profiles: 378 | - discovery 379 | 380 | # plugins 381 | notifications: 382 | image: audius/discovery-provider-notifications:${TAG:-current} 383 | container_name: notifications 384 | restart: unless-stopped 385 | networks: 386 | - discovery-provider-network 387 | env_file: 388 | - ${NETWORK:-prod}.env 389 | - ${OVERRIDE_PATH:-override.env} 390 | logging: 391 | options: 392 | max-size: 10m 393 | max-file: 3 394 | mode: non-blocking 395 | max-buffer-size: 100m 396 | driver: json-file 397 | profiles: 398 | - notifications 399 | 400 | sla-auditor: 401 | image: audius/sla-auditor:${TAG:-current} 402 | container_name: sla-auditor 403 | restart: unless-stopped 404 | networks: 405 | - discovery-provider-network 406 | env_file: 407 | - ${NETWORK:-prod}.env 408 | - ${OVERRIDE_PATH:-override.env} 409 | profiles: 410 | - sla-auditor 411 | logging: 412 | options: 413 | max-size: 10m 414 | max-file: 3 415 | mode: non-blocking 416 | max-buffer-size: 100m 417 | driver: json-file 418 | 419 | crm: 420 | image: audius/crm:${TAG:-current} 421 | container_name: crm 422 | restart: unless-stopped 423 | networks: 424 | - discovery-provider-network 425 | env_file: 426 | - ${NETWORK:-prod}.env 427 | - ${OVERRIDE_PATH:-override.env} 428 | profiles: 429 | - crm 430 | logging: 431 | options: 432 | max-size: 10m 433 | max-file: 3 434 | mode: non-blocking 435 | max-buffer-size: 100m 436 | driver: json-file 437 | 438 | trending-challenge-rewards: 439 | image: audius/trending-challenge-rewards:${TAG:-current} 440 | container_name: trending-challenge-rewards 441 | restart: unless-stopped 442 | networks: 443 | - discovery-provider-network 444 | env_file: 445 | - ${NETWORK:-prod}.env 446 | - ${OVERRIDE_PATH:-override.env} 447 | profiles: 448 | - trending-challenge-rewards 449 | logging: 450 | options: 451 | max-size: 10m 452 | max-file: 3 453 | mode: non-blocking 454 | max-buffer-size: 100m 455 | driver: json-file 456 | 457 | 458 | verified-notifications: 459 | # specific tag because this plugin isn't a part of pedalboard 460 | image: audius/verified-notifications:540cbb93546f653ad78847f5850c63c8a3de5c02 461 | container_name: verified-notifications 462 | restart: unless-stopped 463 | networks: 464 | - discovery-provider-network 465 | env_file: 466 | - ${NETWORK:-prod}.env 467 | - ${OVERRIDE_PATH:-override.env} 468 | profiles: 469 | - verified-notifications 470 | logging: 471 | options: 472 | max-size: 10m 473 | max-file: 3 474 | mode: non-blocking 475 | max-buffer-size: 100m 476 | driver: json-file 477 | 478 | mri: 479 | image: audius/mri:${TAG:-current} 480 | container_name: mri 481 | restart: unless-stopped 482 | networks: 483 | - discovery-provider-network 484 | env_file: 485 | - ${NETWORK:-prod}.env 486 | - ${OVERRIDE_PATH:-override.env} 487 | profiles: 488 | - mri 489 | logging: 490 | options: 491 | max-size: 10m 492 | max-file: 3 493 | mode: non-blocking 494 | max-buffer-size: 100m 495 | driver: json-file 496 | 497 | anti-abuse: 498 | image: audius/anti-abuse:${TAG:-current} 499 | container_name: anti-abuse 500 | restart: unless-stopped 501 | networks: 502 | - discovery-provider-network 503 | env_file: 504 | - ${NETWORK:-prod}.env 505 | - ${OVERRIDE_PATH:-override.env} 506 | profiles: 507 | - anti-abuse 508 | logging: 509 | options: 510 | max-size: 10m 511 | max-file: 3 512 | mode: non-blocking 513 | max-buffer-size: 100m 514 | driver: json-file 515 | 516 | archiver: 517 | image: audius/archiver:${TAG:-current} 518 | container_name: archiver 519 | restart: unless-stopped 520 | networks: 521 | - discovery-provider-network 522 | env_file: 523 | - ${NETWORK:-prod}.env 524 | - ${OVERRIDE_PATH:-override.env} 525 | profiles: 526 | - archiver 527 | logging: 528 | options: 529 | max-size: 10m 530 | max-file: 3 531 | mode: non-blocking 532 | max-buffer-size: 100m 533 | driver: json-file 534 | 535 | staking: 536 | image: audius/staking:${TAG:-current} 537 | container_name: staking 538 | restart: unless-stopped 539 | networks: 540 | - discovery-provider-network 541 | env_file: 542 | - ${NETWORK:-prod}.env 543 | - ${OVERRIDE_PATH:-override.env} 544 | profiles: 545 | - staking 546 | logging: 547 | options: 548 | max-size: 10m 549 | max-file: 3 550 | mode: non-blocking 551 | max-buffer-size: 100m 552 | driver: json-file 553 | 554 | metabase: 555 | image: metabase/metabase:v0.48.0 556 | container_name: metabase 557 | hostname: metabase 558 | volumes: 559 | - /dev/urandom:/dev/random:ro 560 | environment: 561 | MB_DB_TYPE: postgres 562 | MB_DB_DBNAME: audius_discovery 563 | MB_DB_PORT: 5432 564 | MB_DB_USER: postgres 565 | MB_DB_PASS: postgres 566 | MB_DB_HOST: postgres 567 | networks: 568 | - discovery-provider-network 569 | profiles: 570 | - metabase 571 | healthcheck: 572 | test: curl --fail -I http://localhost:3000/api/health || exit 1 573 | interval: 15s 574 | timeout: 5s 575 | retries: 5 576 | 577 | # core only node services 578 | audiusd: 579 | image: audius/audiusd:${TAG:-current} 580 | container_name: audiusd 581 | pull_policy: always 582 | <<: *extra-hosts 583 | restart: unless-stopped 584 | networks: 585 | - discovery-provider-network 586 | ports: 587 | - '26656:26656' # cometBFT P2P server 588 | - '26657:26657' # cometBFT RPC server 589 | - '26659:26659' # console UI 590 | - '50051:50051' # core GRPC server 591 | - '127.0.0.1:5432:5432' # postgresql 592 | - "${AUDIUSD_HTTP_PORT:-80}:80" # echoserver http required for auto tls 593 | - "${AUDIUSD_HTTPS_PORT:-443}:443" # echoserver https via letsencrypt 594 | env_file: 595 | - ${NETWORK:-prod}.env 596 | - ${OVERRIDE_PATH:-override.env} 597 | environment: 598 | - LOGSPOUT=ignore 599 | - AUDIUSD_STORAGE_ENABLED=false 600 | - audius_core_root_dir=/audius-core 601 | - audius_db_url=postgresql://postgres:postgres@localhost:5432/audius_discovery 602 | - audius_db_url_read_replica=postgresql://postgres:postgres@localhost:5432/audius_discovery 603 | logging: 604 | options: 605 | max-size: 10m 606 | max-file: 3 607 | mode: non-blocking 608 | max-buffer-size: 100m 609 | driver: json-file 610 | volumes: 611 | - /var/k8s/bolt:/bolt 612 | - /var/k8s/bolt:/audius-core 613 | - /var/k8s/discovery-provider-db:/data/postgres 614 | deploy: 615 | resources: 616 | limits: 617 | cpus: '6.0' 618 | memory: '14G' 619 | profiles: 620 | - audiusd 621 | 622 | vector: 623 | extends: 624 | file: ../common-services.yml 625 | service: vector 626 | env_file: 627 | - ${NETWORK:-prod}.env 628 | - ${OVERRIDE_PATH:-override.env} 629 | networks: 630 | - discovery-provider-network 631 | profiles: 632 | - discovery 633 | - audiusd 634 | 635 | networks: 636 | discovery-provider-network: 637 | 638 | volumes: 639 | esdata: 640 | caddy_data: 641 | caddy_config: 642 | -------------------------------------------------------------------------------- /discovery-provider/prod.env: -------------------------------------------------------------------------------- 1 | # DO NOT MODIFY these values, use `audius-cli get-config discovery-provider` for accurate values 2 | 3 | audius_redis_url=redis://cache:6379/00 4 | 5 | audius_db_url=postgresql://postgres:postgres@db:5432/audius_discovery 6 | audius_db_url_read_replica=postgresql://postgres:postgres@db:5432/audius_discovery 7 | 8 | audius_contracts_registry=0xC611C82150b56E6e4Ec5973AcAbA8835Dd0d75A2 9 | audius_contracts_entity_manager_address=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 10 | audius_contracts_nethermind_entity_manager_address=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 11 | audius_contracts_verified_address=0xbeef8E42e8B5964fDD2b7ca8efA0d9aef38AA996 12 | audius_cors_allow_all=true 13 | audius_openresty_enable=true 14 | audius_discprov_blacklist_block_processing_window=1200 15 | audius_discprov_block_processing_window=100 16 | audius_discprov_env=prod 17 | audius_discprov_get_users_cnode_ttl_sec=300 18 | audius_discprov_identity_service_url=https://identityservice.audius.co 19 | audius_discprov_notifications_max_block_diff=10 20 | audius_discprov_start_block=0xa7cac7f512e8ce7bdeeeaa636b66795ac75ac104ba7d77ef79be9e8d0d7794f3 21 | audius_discprov_user_metadata_service_url=https://usermetadata.audius.co 22 | audius_elasticsearch_url='http://elasticsearch:9200' 23 | audius_elasticsearch_search_enabled='true' 24 | audius_enable_rsyslog=false 25 | audius_eth_contracts_registry=0xd976d3b4f4e22a238c1A736b6612D22f17b6f64C 26 | audius_eth_token_address=0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998 27 | audius_final_poa_block=31413000 28 | audius_gunicorn_worker_class=eventlet 29 | audius_gunicorn_workers=8 30 | audius_solana_endpoint=AaHR0cHM6Ly9hdWuRpdXMucnBjcG9vdbC5jb20vOWMyNjiViMzUtOGJlZS00uNjVlLTg3ODktMTsRlMmM2MTNhN2Fj 31 | audius_solana_rewards_manager_account=71hWFVYokLaN1PNYzTAWi13EfJ7Xt9VbSWUKsXUT8mxE 32 | audius_solana_rewards_manager_min_slot=0 33 | audius_solana_rewards_manager_program_address=DDZDcYdQFEMwcu2Mwo75yGFjJ1mUQyyXLWzhZLEVFcei 34 | audius_solana_signer_group_address=FbfwE8ZmVdwUbbEXdq4ofhuUEiAxeSk5kaoYrJJekpnZ 35 | audius_solana_track_listen_count_address=7K3UpbZViPnQDLn2DAM853B9J5GBxd1L1rLHy4KqSmWG 36 | audius_solana_user_bank_min_slot=0 37 | audius_solana_user_bank_program_address=Ewkv3JahEFRKkcJmpoKB7pXbnUHwjAyXiwEo4ZY2rezQ 38 | audius_solana_waudio_mint=9LzCMqDgTKYz9Drzqnpgee3SGa89up3a247ypMj2xrqM 39 | audius_solana_usdc_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 40 | audius_solana_staking_bridge_usdc_payout_wallet=7vGA3fcjvxa3A11MAxmyhFtYowPLLCNyvoxxgN3NN2Vf 41 | audius_web3_eth_provider_url=https://eth-mainnet.g.alchemy.com/v2/jxDQvtprZBSxiGW1KTtZR2_O1ZZLCoC3 42 | audius_web3_localhost=http://chain:8545 43 | audius_web3_host=https://acdc-gateway.audius.co 44 | audius_web3_port=443 45 | audius_discprov_backfill_social_rewards_blocknumber=30206969 46 | audius_dummy_counter=0 47 | audius_identity_relayer_public_key=0xdead88167Bd06Cbc251FB8336B44259c6407dd07 48 | audius_discprov_comment_karma_threshold=1700000 49 | 50 | # audius_static_nodes=prod-dn1,prod-dn2,prod-dn3 51 | audius_static_nodes=enode://670ca0ebcd3f3f55414d46fdde5d6eb67be5a61112b9c4095e4e666d98ba3f6c6d4a40e482e63af277469c615f0fa611a7897aac211c47c4c371c8abde28b001@35.162.137.74:30300,enode://e8ea14ab80b80bd6a119433c5045a598b26ff1a4ce552a92fb4cb22cb31eb8a1692b8e728ca1d8fab4cdef693669c8ad829e810c4314a5f6f3dff97233edb6f1@34.67.133.214:30300,enode://8c7dc881ff0c743c139e535bf84dbac79d80fa106b2b96c5a5b502c138e8961b88ca6d36666b0a07a3529eb2e63124be50dc6bb252c0e346ce022a6b273611dc@34.121.217.14:30300 52 | audius_genesis_signers=f1a1Bd34b2Bc73629aa69E50E3249E89A3c16786c97d40C0B992882646D64814151941A1c520b460F2897993951d53a7E3eb2242D6A14D2028140DC8 53 | 54 | # required values 55 | audius_delegate_owner_wallet= 56 | audius_delegate_private_key= 57 | audius_discprov_url= 58 | 59 | # chain 60 | audius_discprov_max_signers=0 61 | 62 | # logging 63 | audius_axiom_dataset=discovery 64 | 65 | # relay 66 | audius_aao_endpoint=https://antiabuseoracle.audius.co 67 | audius_use_aao=true 68 | 69 | # /d UI 70 | audius_url=https://audius.co 71 | audius_eth_network_id=1 72 | audius_eth_owner_wallet=0xe886a1858d2d368ef8f02c65bdd470396a1ab188 73 | audius_query_proposal_start_block=11818009 74 | audius_gql_uri=https://gateway.thegraph.com/api/372f3681a94e4a45867d46cf59423e22/subgraphs/id/0x819fd65026848d710fe40d8c0439f1220e069398-0 75 | audius_gql_backup_uri=https://api.thegraph.com/subgraphs/name/audius-infra/audius-network-mainnet 76 | audius_wormhole_contract_address=0x6E7a1F7339bbB62b23D44797b63e4258d283E095 77 | audius_solana_claim_distribution_contract_address=0x683c19E621A0F107a291fdAB38f80179809d61B5 78 | audius_solana_cluster_endpoint=https://solana-mainnet.g.alchemy.com/v2/fCWqhO4QJ7X8XqXvi213Mzclmn-30-ie 79 | audius_solana_token_program_address=TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 80 | audius_solana_claimable_token_pda=5ZiE3vAkrdXBgyFL7KqG3RoEGBws4CjRcXVbABDLZTgx 81 | audius_solana_fee_payer_address=CgJhbUdHQNN5HBeNEN7J69Z89emh6BtyYX1CPEGwaeqi 82 | audius_solana_rewards_manager_token_pda=3V9opXNpHmPPymKeq7CYD8wWMH8wzFXmqEkNdzfsZhYq 83 | audius_solana_payment_router_min_slot=0 84 | audius_solana_payment_router_program_address=paytYpX3LPN98TAeen6bFFeraGSuWnomZmCXjAsoqPa 85 | 86 | # ddex 87 | audius_ddex_apps= 88 | 89 | # Core 90 | audius_core_root_dir=/audius-core 91 | -------------------------------------------------------------------------------- /discovery-provider/seed.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | set -e 3 | 4 | NETWORK=$1 5 | AUTOSEED=$2 6 | 7 | MIN_DB_SIZE="2147483648" # 2GB 8 | 9 | function should_auto_seed() { 10 | db_size="$(psql "$audius_db_url" -t -c "SELECT pg_database_size(current_database());")" 11 | echo Current DB size detected as "$db_size" 12 | if [ -n "$db_size" ] && [[ "$db_size" -gt "0" ]] && [[ "$db_size" -lt "$MIN_DB_SIZE" ]]; then 13 | return 0 14 | else 15 | return 1 16 | fi 17 | } 18 | 19 | if [[ "$AUTOSEED" = "true" ]] && ! should_auto_seed; then 20 | echo "(auto-seed) skipping seeding as database appears to already be populated." 21 | exit 0 22 | fi 23 | 24 | if [[ "$NETWORK" == "prod" ]]; then 25 | echo "Downloading $NETWORK database..." 26 | curl https://audius-pgdump.s3-us-west-2.amazonaws.com/discProvProduction.dump -O 27 | echo "Restoring $NETWORK database to $audius_db_url..." 28 | pg_restore -d $audius_db_url --username postgres --no-privileges --clean --if-exists --verbose -j 8 discProvProduction.dump 29 | elif [[ "$NETWORK" == "stage" ]]; then 30 | echo "Downloading $NETWORK database..." 31 | curl https://audius-pgdump.s3-us-west-2.amazonaws.com/discProvStaging.dump -O 32 | echo "Restoring $NETWORK database to $audius_db_url..." 33 | pg_restore -d $audius_db_url --username postgres --no-privileges --clean --if-exists --verbose -j 8 discProvStaging.dump 34 | elif [[ "$NETWORK" == "dev" ]]; then 35 | echo "Skipping seeding for dev network" 36 | else 37 | echo "Invalid network: $NETWORK" 38 | exit 1 39 | fi 40 | -------------------------------------------------------------------------------- /discovery-provider/stage.env: -------------------------------------------------------------------------------- 1 | # DO NOT MODIFY these values, use `audius-cli get-config discovery-provider` for accurate values 2 | 3 | audius_redis_url=redis://cache:6379/00 4 | 5 | audius_db_url=postgresql://postgres:postgres@db:5432/audius_discovery 6 | audius_db_url_read_replica=postgresql://postgres:postgres@db:5432/audius_discovery 7 | 8 | audius_contracts_registry=0x793373aBF96583d5eb71a15d86fFE732CD04D452 9 | audius_contracts_entity_manager_address=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 10 | audius_contracts_nethermind_entity_manager_address=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 11 | audius_contracts_verified_address=0xbbbb93A6B3A1D6fDd27909729b95CCB0cc9002C0 12 | audius_cors_allow_all=true 13 | audius_openresty_enable=true 14 | audius_discprov_blacklist_block_processing_window=1200 15 | audius_discprov_block_processing_window=100 16 | AUDIUS_NATS_ENABLE_JETSTREAM=true 17 | AUDIUS_IS_STAGING=true 18 | audius_discprov_env=stage 19 | audius_discprov_get_users_cnode_ttl_sec=300 20 | audius_discprov_identity_service_url=https://identityservice.staging.audius.co 21 | audius_discprov_notifications_max_block_diff=10 22 | audius_discprov_start_block=0x65a3243860511ed28a933c3a113dea7df368ad53f721cc9d0034c0c75f996afb 23 | audius_discprov_user_metadata_service_url=https://usermetadata.staging.audius.co 24 | audius_elasticsearch_url='http://elasticsearch:9200' 25 | audius_elasticsearch_search_enabled='true' 26 | audius_enable_rsyslog=false 27 | audius_eth_contracts_registry=0xc682C2166E11690B64338e11633Cb8Bb60B0D9c0 28 | audius_eth_token_address=0x1376180Ee935AA64A27780F4BE97726Df7B0e2B2 29 | audius_final_poa_block=32269859 30 | audius_gunicorn_worker_class=eventlet 31 | audius_gunicorn_workers=8 32 | audius_solana_endpoint=AaHR0cHM6Ly9hdWuRpdXMucnBjcG9vdbC5jb20vOWMyNjiViMzUtOGJlZS00uNjVlLTg3ODktMTsRlMmM2MTNhN2Fj 33 | audius_solana_rewards_manager_account=GaiG9LDYHfZGqeNaoGRzFEnLiwUT7WiC6sA6FDJX9ZPq 34 | audius_solana_rewards_manager_min_slot=0 35 | audius_solana_rewards_manager_program_address=CDpzvz7DfgbF95jSSCHLX3ERkugyfgn9Fw8ypNZ1hfXp 36 | audius_solana_signer_group_address=DP5ymiCCQurW9jTeDwHAUs3jmfmnqqypGgNF573wje5e 37 | audius_solana_track_listen_count_address=ApR7QbouRviwoE6nLL83omE6GdtM6yUJAsuXw5sPDCQV 38 | audius_solana_user_bank_min_slot=0 39 | audius_solana_user_bank_program_address=2sjQNmUfkV6yKKi4dPR8gWRgtyma5aiymE3aXL2RAZww 40 | audius_solana_waudio_mint=BELGiMZQ34SDE6x2FUaML2UHDAgBLS64xvhXjX5tBBZo 41 | audius_solana_usdc_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 42 | audius_web3_eth_provider_url=https://eth-sepolia.g.alchemy.com/v2/J1Pj86H-g87FqUZVMUbLGgnyoaQTHP1P 43 | audius_web3_localhost=http://chain:8545 44 | audius_web3_host=https://acdc-gateway.staging.audius.co 45 | audius_web3_port=443 46 | audius_discprov_backfill_social_rewards_blocknumber=27214200 47 | audius_identity_relayer_public_key=0x01083881956D45146CdB79b88ecB45C6dFbC5B8B 48 | audius_discprov_comment_karma_threshold=4000 49 | 50 | # audius_static_nodes=stage-dn1,stage-dn2,stage-dn3 51 | audius_static_nodes=enode://60f1a344519565ca6c0374a0dd1ee8f48e97b15f99d7c881e2cfd4addd7c5880856d1b95551ac040434f36e61ec3fe9830f13842ab8a09164a0a6b3841d38faa@34.136.229.16:30300,enode://e10bb7fd9255db83ff9974f875259b428bb94c29c51577f7093d7d2e732a5b18cc0223803a48c6b4a04318f23b3fcb4511853f7a3be7629c60ed816a51f6b409@34.67.210.7:30300,enode://435c60e1611aaf3a45e4ea25c4e6e4b6abe0e3fdd43a6cf1e9f705b87094a17ec0b7371aaf04138105da4b9092627dc36fec3bca6e8b7068f26a0743477127fe@34.136.137.33:30300 52 | audius_genesis_signers=8fcfa10bd3808570987dbb5b1ef4ab74400fbfda5e98cbeeaa2acedec0833ac3d1634e2a7ae0f3c2f7c96916bd37ad76d4eedd6536b81c29706c8056 53 | 54 | # required values 55 | audius_delegate_owner_wallet= 56 | audius_delegate_private_key= 57 | audius_discprov_url= 58 | 59 | # chain 60 | audius_discprov_max_signers=0 61 | 62 | # logging 63 | audius_axiom_dataset=stage-discovery 64 | 65 | # relay 66 | audius_aao_endpoint=https://antiabuseoracle.staging.audius.co 67 | audius_use_aao=true 68 | 69 | # /d UI 70 | audius_url=https://staging.audius.co 71 | audius_eth_network_id=11155111 72 | audius_eth_owner_wallet= 73 | audius_query_proposal_start_block=1 74 | audius_gql_uri=https://api.thegraph.com/subgraphs/name/audius-infra/audius-network-sepolia 75 | audius_gql_backup_uri= 76 | audius_wormhole_contract_address=0xf6f45e4d836da1d4ecd43bb1074620bfb0b7e0d7 77 | audius_solana_claim_distribution_contract_address=0x74b89B916c97d50557E8F944F32662fE52Ce378d 78 | audius_solana_cluster_endpoint=https://solana-mainnet.g.alchemy.com/v2/N_o4w4Lgk2afO8uho9uuZu0LNi6gldVz 79 | audius_solana_token_program_address=TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 80 | audius_solana_claimable_token_pda=Aw5AjygeMf9Nvg61BXvFSAzkqxcLqL8koepb14kvfc3W 81 | audius_solana_fee_payer_address=E3CfijtAJwBSHfwFEViAUd3xp7c8TBxwC1eXn1Fgxp8h 82 | audius_solana_rewards_manager_token_pda=HJQj8P47BdA7ugjQEn45LaESYrxhiZDygmukt8iumFZJ 83 | audius_solana_payment_router_min_slot=0 84 | audius_solana_payment_router_program_address=sp28KA2bTnTA4oSZ3r9tTSKfmiXZtZQHnYYQqWfUyVa 85 | audius_solana_staking_bridge_usdc_payout_wallet=GKvndGv2CoKgKQ17GUtFSc7KrFonYxhfbWeczS29MbpP 86 | 87 | # ddex 88 | audius_ddex_apps='49d5e13d355709b615b7cce7369174fb240b6b39,574a8f89a3009591329a6fb1bf6428645959484f,d3181889d8fe71fe313683f7cca60423b74cf762' 89 | 90 | # Core 91 | audius_core_root_dir=/audius-core 92 | audius_core_log_level=info 93 | -------------------------------------------------------------------------------- /eth-contracts/ABIs/Registry.json: -------------------------------------------------------------------------------- 1 | { 2 | "contractName": "Registry", 3 | "abi": [ 4 | { 5 | "anonymous": false, 6 | "inputs": [ 7 | { 8 | "indexed": true, 9 | "internalType": "bytes32", 10 | "name": "_name", 11 | "type": "bytes32" 12 | }, 13 | { 14 | "indexed": true, 15 | "internalType": "address", 16 | "name": "_address", 17 | "type": "address" 18 | } 19 | ], 20 | "name": "ContractAdded", 21 | "type": "event" 22 | }, 23 | { 24 | "anonymous": false, 25 | "inputs": [ 26 | { 27 | "indexed": true, 28 | "internalType": "bytes32", 29 | "name": "_name", 30 | "type": "bytes32" 31 | }, 32 | { 33 | "indexed": true, 34 | "internalType": "address", 35 | "name": "_address", 36 | "type": "address" 37 | } 38 | ], 39 | "name": "ContractRemoved", 40 | "type": "event" 41 | }, 42 | { 43 | "anonymous": false, 44 | "inputs": [ 45 | { 46 | "indexed": true, 47 | "internalType": "bytes32", 48 | "name": "_name", 49 | "type": "bytes32" 50 | }, 51 | { 52 | "indexed": true, 53 | "internalType": "address", 54 | "name": "_oldAddress", 55 | "type": "address" 56 | }, 57 | { 58 | "indexed": true, 59 | "internalType": "address", 60 | "name": "_newAddress", 61 | "type": "address" 62 | } 63 | ], 64 | "name": "ContractUpgraded", 65 | "type": "event" 66 | }, 67 | { 68 | "anonymous": false, 69 | "inputs": [ 70 | { 71 | "indexed": true, 72 | "internalType": "address", 73 | "name": "previousOwner", 74 | "type": "address" 75 | }, 76 | { 77 | "indexed": true, 78 | "internalType": "address", 79 | "name": "newOwner", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "OwnershipTransferred", 84 | "type": "event" 85 | }, 86 | { 87 | "constant": true, 88 | "inputs": [], 89 | "name": "isOwner", 90 | "outputs": [ 91 | { 92 | "internalType": "bool", 93 | "name": "", 94 | "type": "bool" 95 | } 96 | ], 97 | "payable": false, 98 | "stateMutability": "view", 99 | "type": "function" 100 | }, 101 | { 102 | "constant": true, 103 | "inputs": [], 104 | "name": "owner", 105 | "outputs": [ 106 | { 107 | "internalType": "address", 108 | "name": "", 109 | "type": "address" 110 | } 111 | ], 112 | "payable": false, 113 | "stateMutability": "view", 114 | "type": "function" 115 | }, 116 | { 117 | "constant": false, 118 | "inputs": [], 119 | "name": "renounceOwnership", 120 | "outputs": [], 121 | "payable": false, 122 | "stateMutability": "nonpayable", 123 | "type": "function" 124 | }, 125 | { 126 | "constant": false, 127 | "inputs": [ 128 | { 129 | "internalType": "address", 130 | "name": "newOwner", 131 | "type": "address" 132 | } 133 | ], 134 | "name": "transferOwnership", 135 | "outputs": [], 136 | "payable": false, 137 | "stateMutability": "nonpayable", 138 | "type": "function" 139 | }, 140 | { 141 | "constant": false, 142 | "inputs": [], 143 | "name": "initialize", 144 | "outputs": [], 145 | "payable": false, 146 | "stateMutability": "nonpayable", 147 | "type": "function" 148 | }, 149 | { 150 | "constant": false, 151 | "inputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "sender", 155 | "type": "address" 156 | } 157 | ], 158 | "name": "initialize", 159 | "outputs": [], 160 | "payable": false, 161 | "stateMutability": "nonpayable", 162 | "type": "function" 163 | }, 164 | { 165 | "constant": false, 166 | "inputs": [ 167 | { 168 | "internalType": "bytes32", 169 | "name": "_name", 170 | "type": "bytes32" 171 | }, 172 | { 173 | "internalType": "address", 174 | "name": "_address", 175 | "type": "address" 176 | } 177 | ], 178 | "name": "addContract", 179 | "outputs": [], 180 | "payable": false, 181 | "stateMutability": "nonpayable", 182 | "type": "function" 183 | }, 184 | { 185 | "constant": false, 186 | "inputs": [ 187 | { 188 | "internalType": "bytes32", 189 | "name": "_name", 190 | "type": "bytes32" 191 | } 192 | ], 193 | "name": "removeContract", 194 | "outputs": [], 195 | "payable": false, 196 | "stateMutability": "nonpayable", 197 | "type": "function" 198 | }, 199 | { 200 | "constant": false, 201 | "inputs": [ 202 | { 203 | "internalType": "bytes32", 204 | "name": "_name", 205 | "type": "bytes32" 206 | }, 207 | { 208 | "internalType": "address", 209 | "name": "_newAddress", 210 | "type": "address" 211 | } 212 | ], 213 | "name": "upgradeContract", 214 | "outputs": [], 215 | "payable": false, 216 | "stateMutability": "nonpayable", 217 | "type": "function" 218 | }, 219 | { 220 | "constant": true, 221 | "inputs": [ 222 | { 223 | "internalType": "bytes32", 224 | "name": "_name", 225 | "type": "bytes32" 226 | }, 227 | { 228 | "internalType": "uint256", 229 | "name": "_version", 230 | "type": "uint256" 231 | } 232 | ], 233 | "name": "getContract", 234 | "outputs": [ 235 | { 236 | "internalType": "address", 237 | "name": "contractAddr", 238 | "type": "address" 239 | } 240 | ], 241 | "payable": false, 242 | "stateMutability": "view", 243 | "type": "function" 244 | }, 245 | { 246 | "constant": true, 247 | "inputs": [ 248 | { 249 | "internalType": "bytes32", 250 | "name": "_name", 251 | "type": "bytes32" 252 | } 253 | ], 254 | "name": "getContract", 255 | "outputs": [ 256 | { 257 | "internalType": "address", 258 | "name": "contractAddr", 259 | "type": "address" 260 | } 261 | ], 262 | "payable": false, 263 | "stateMutability": "view", 264 | "type": "function" 265 | }, 266 | { 267 | "constant": true, 268 | "inputs": [ 269 | { 270 | "internalType": "bytes32", 271 | "name": "_name", 272 | "type": "bytes32" 273 | } 274 | ], 275 | "name": "getContractVersionCount", 276 | "outputs": [ 277 | { 278 | "internalType": "uint256", 279 | "name": "", 280 | "type": "uint256" 281 | } 282 | ], 283 | "payable": false, 284 | "stateMutability": "view", 285 | "type": "function" 286 | } 287 | ] 288 | } -------------------------------------------------------------------------------- /eth-contracts/ABIs/ServiceTypeManager.json: -------------------------------------------------------------------------------- 1 | { 2 | "contractName": "ServiceTypeManagerProxy", 3 | "abi": [ 4 | { 5 | "anonymous": false, 6 | "inputs": [ 7 | { 8 | "indexed": true, 9 | "internalType": "bytes32", 10 | "name": "_serviceType", 11 | "type": "bytes32" 12 | }, 13 | { 14 | "indexed": true, 15 | "internalType": "uint256", 16 | "name": "_serviceTypeMin", 17 | "type": "uint256" 18 | }, 19 | { 20 | "indexed": true, 21 | "internalType": "uint256", 22 | "name": "_serviceTypeMax", 23 | "type": "uint256" 24 | } 25 | ], 26 | "name": "ServiceTypeAdded", 27 | "type": "event" 28 | }, 29 | { 30 | "anonymous": false, 31 | "inputs": [ 32 | { 33 | "indexed": true, 34 | "internalType": "bytes32", 35 | "name": "_serviceType", 36 | "type": "bytes32" 37 | } 38 | ], 39 | "name": "ServiceTypeRemoved", 40 | "type": "event" 41 | }, 42 | { 43 | "anonymous": false, 44 | "inputs": [ 45 | { 46 | "indexed": true, 47 | "internalType": "bytes32", 48 | "name": "_serviceType", 49 | "type": "bytes32" 50 | }, 51 | { 52 | "indexed": true, 53 | "internalType": "bytes32", 54 | "name": "_serviceVersion", 55 | "type": "bytes32" 56 | } 57 | ], 58 | "name": "SetServiceVersion", 59 | "type": "event" 60 | }, 61 | { 62 | "constant": false, 63 | "inputs": [], 64 | "name": "initialize", 65 | "outputs": [], 66 | "payable": false, 67 | "stateMutability": "nonpayable", 68 | "type": "function" 69 | }, 70 | { 71 | "constant": false, 72 | "inputs": [ 73 | { 74 | "internalType": "address", 75 | "name": "_governanceAddress", 76 | "type": "address" 77 | } 78 | ], 79 | "name": "initialize", 80 | "outputs": [], 81 | "payable": false, 82 | "stateMutability": "nonpayable", 83 | "type": "function" 84 | }, 85 | { 86 | "constant": true, 87 | "inputs": [], 88 | "name": "getGovernanceAddress", 89 | "outputs": [ 90 | { 91 | "internalType": "address", 92 | "name": "", 93 | "type": "address" 94 | } 95 | ], 96 | "payable": false, 97 | "stateMutability": "view", 98 | "type": "function" 99 | }, 100 | { 101 | "constant": false, 102 | "inputs": [ 103 | { 104 | "internalType": "address", 105 | "name": "_governanceAddress", 106 | "type": "address" 107 | } 108 | ], 109 | "name": "setGovernanceAddress", 110 | "outputs": [], 111 | "payable": false, 112 | "stateMutability": "nonpayable", 113 | "type": "function" 114 | }, 115 | { 116 | "constant": false, 117 | "inputs": [ 118 | { 119 | "internalType": "bytes32", 120 | "name": "_serviceType", 121 | "type": "bytes32" 122 | }, 123 | { 124 | "internalType": "uint256", 125 | "name": "_serviceTypeMin", 126 | "type": "uint256" 127 | }, 128 | { 129 | "internalType": "uint256", 130 | "name": "_serviceTypeMax", 131 | "type": "uint256" 132 | } 133 | ], 134 | "name": "addServiceType", 135 | "outputs": [], 136 | "payable": false, 137 | "stateMutability": "nonpayable", 138 | "type": "function" 139 | }, 140 | { 141 | "constant": false, 142 | "inputs": [ 143 | { 144 | "internalType": "bytes32", 145 | "name": "_serviceType", 146 | "type": "bytes32" 147 | } 148 | ], 149 | "name": "removeServiceType", 150 | "outputs": [], 151 | "payable": false, 152 | "stateMutability": "nonpayable", 153 | "type": "function" 154 | }, 155 | { 156 | "constant": true, 157 | "inputs": [ 158 | { 159 | "internalType": "bytes32", 160 | "name": "_serviceType", 161 | "type": "bytes32" 162 | } 163 | ], 164 | "name": "getServiceTypeInfo", 165 | "outputs": [ 166 | { 167 | "internalType": "bool", 168 | "name": "isValid", 169 | "type": "bool" 170 | }, 171 | { 172 | "internalType": "uint256", 173 | "name": "minStake", 174 | "type": "uint256" 175 | }, 176 | { 177 | "internalType": "uint256", 178 | "name": "maxStake", 179 | "type": "uint256" 180 | } 181 | ], 182 | "payable": false, 183 | "stateMutability": "view", 184 | "type": "function" 185 | }, 186 | { 187 | "constant": true, 188 | "inputs": [], 189 | "name": "getValidServiceTypes", 190 | "outputs": [ 191 | { 192 | "internalType": "bytes32[]", 193 | "name": "", 194 | "type": "bytes32[]" 195 | } 196 | ], 197 | "payable": false, 198 | "stateMutability": "view", 199 | "type": "function" 200 | }, 201 | { 202 | "constant": true, 203 | "inputs": [ 204 | { 205 | "internalType": "bytes32", 206 | "name": "_serviceType", 207 | "type": "bytes32" 208 | } 209 | ], 210 | "name": "serviceTypeIsValid", 211 | "outputs": [ 212 | { 213 | "internalType": "bool", 214 | "name": "", 215 | "type": "bool" 216 | } 217 | ], 218 | "payable": false, 219 | "stateMutability": "view", 220 | "type": "function" 221 | }, 222 | { 223 | "constant": false, 224 | "inputs": [ 225 | { 226 | "internalType": "bytes32", 227 | "name": "_serviceType", 228 | "type": "bytes32" 229 | }, 230 | { 231 | "internalType": "bytes32", 232 | "name": "_serviceVersion", 233 | "type": "bytes32" 234 | } 235 | ], 236 | "name": "setServiceVersion", 237 | "outputs": [], 238 | "payable": false, 239 | "stateMutability": "nonpayable", 240 | "type": "function" 241 | }, 242 | { 243 | "constant": true, 244 | "inputs": [ 245 | { 246 | "internalType": "bytes32", 247 | "name": "_serviceType", 248 | "type": "bytes32" 249 | }, 250 | { 251 | "internalType": "uint256", 252 | "name": "_versionIndex", 253 | "type": "uint256" 254 | } 255 | ], 256 | "name": "getVersion", 257 | "outputs": [ 258 | { 259 | "internalType": "bytes32", 260 | "name": "", 261 | "type": "bytes32" 262 | } 263 | ], 264 | "payable": false, 265 | "stateMutability": "view", 266 | "type": "function" 267 | }, 268 | { 269 | "constant": true, 270 | "inputs": [ 271 | { 272 | "internalType": "bytes32", 273 | "name": "_serviceType", 274 | "type": "bytes32" 275 | } 276 | ], 277 | "name": "getCurrentVersion", 278 | "outputs": [ 279 | { 280 | "internalType": "bytes32", 281 | "name": "", 282 | "type": "bytes32" 283 | } 284 | ], 285 | "payable": false, 286 | "stateMutability": "view", 287 | "type": "function" 288 | }, 289 | { 290 | "constant": true, 291 | "inputs": [ 292 | { 293 | "internalType": "bytes32", 294 | "name": "_serviceType", 295 | "type": "bytes32" 296 | } 297 | ], 298 | "name": "getNumberOfVersions", 299 | "outputs": [ 300 | { 301 | "internalType": "uint256", 302 | "name": "", 303 | "type": "uint256" 304 | } 305 | ], 306 | "payable": false, 307 | "stateMutability": "view", 308 | "type": "function" 309 | }, 310 | { 311 | "constant": true, 312 | "inputs": [ 313 | { 314 | "internalType": "bytes32", 315 | "name": "_serviceType", 316 | "type": "bytes32" 317 | }, 318 | { 319 | "internalType": "bytes32", 320 | "name": "_serviceVersion", 321 | "type": "bytes32" 322 | } 323 | ], 324 | "name": "serviceVersionIsValid", 325 | "outputs": [ 326 | { 327 | "internalType": "bool", 328 | "name": "", 329 | "type": "bool" 330 | } 331 | ], 332 | "payable": false, 333 | "stateMutability": "view", 334 | "type": "function" 335 | } 336 | ] 337 | } 338 | -------------------------------------------------------------------------------- /identity-service/dev.env: -------------------------------------------------------------------------------- 1 | # DO NOT MODIFY these values, use `audius-cli get-config identity-service` for accurate values 2 | 3 | environment=development 4 | 5 | userVerifierPrivateKey=ebba299e6163ff3208de4e82ce7db09cf7e434847b5bdab723af96ae7c763a0e 6 | ethRelayerWallets='[{"publicKey":"0xE75dEe171b6472cE30358ede946CcDFfCA70b562","privateKey":"8a7c63d4aea87647f480e4771ea279f90f8e912fcfe907525bc931f531e564ce"},{"publicKey":"0xBE718F98a5B5a473186eB6E30888F26E72be0b66","privateKey":"d3426cd10c4e75207bdc4802c551d21faa89a287546c2c6b3d9a0476f34934d2"},{"publicKey":"0xaaaa90Fc2bfa70028D6b444BB9754066d9E2703b","privateKey":"34efbbc0431c7f481cdba15d65bbc9ef47196b9cf38d5c4b30afa2bcf86fafba"}]' 7 | relayerPrivateKey=34efbbc0431c7f481cdba15d65bbc9ef47196b9cf38d5c4b30afa2bcf86fafba 8 | solanaFeePayerWallets='[{"privateKey":[170,161,84,122,118,210,128,213,96,185,143,218,54,254,217,204,157,175,137,71,202,108,51,242,21,50,56,77,54,116,103,56,251,64,77,100,199,88,103,189,42,163,67,251,101,204,7,59,70,109,113,50,209,154,55,164,227,108,203,146,121,148,85,119]}]' 9 | solanaSignerPrivateKey=d242765e718801781440d77572b9dafcdc9baadf0269eff24cf61510ddbf1003 10 | relayerWallets='[{"publicKey":"0xaaaa90Fc2bfa70028D6b444BB9754066d9E2703b","privateKey":"34efbbc0431c7f481cdba15d65bbc9ef47196b9cf38d5c4b30afa2bcf86fafba"},{"publicKey":"0xBE718F98a5B5a473186eB6E30888F26E72be0b66","privateKey":"d3426cd10c4e75207bdc4802c551d21faa89a287546c2c6b3d9a0476f34934d2"}]' 11 | 12 | solanaAudiusEthRegistryAddress=testBgRfFcage1hN7zmTsktdQCJZkHEhM1eguYPaeKg 13 | ethTokenAddress=0xdcB2fC9469808630DD0744b0adf97C0003fC29B2 14 | solanaValidSigner=yM9adjwKaRbYxQzLPF6zvZMSAfKUNte5xvK4B3iGbkL 15 | redisHost=cache 16 | ethProviderUrl=http://eth-ganache.devnet.audius-d 17 | solanaMintAddress=37RCjhgV1qGV2Q54EHFScdxZ22ydRMdKMtVgod47fDP3 18 | solanaRewardsManagerProgramId=testLsJKtyABc9UXJF8JWFKf1YH4LmqCWBC42c6akPb 19 | secondaryWeb3Provider=http://acdc-ganache.devnet.audius-d 20 | minimumRelayerBalance=1 21 | solanaRewardsManagerProgramPDA=DJPzVothq58SmkpRb1ATn5ddN2Rpv1j2TcGvM3XsHf1c 22 | redisPort=6379 23 | relayerPublicKey=0xaaaa90Fc2bfa70028D6b444BB9754066d9E2703b 24 | solanaClaimableTokenProgramAddress=testHKV1B56fbvop4w6f2cTGEub9dRQ2Euta5VmqdX9 25 | minimumFunderBalance=1 26 | logLevel=debug 27 | ethFunderAddress=0xaaaa90Fc2bfa70028D6b444BB9754066d9E2703b 28 | ownerWallet=0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 29 | solanaAudiusAnchorDataProgramId=testRaQeeuPVd4RK4ae1sHE3xcAQyFuPHBFoVwXWc4k 30 | minimumBalance=1 31 | entityManagerAddress=0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B 32 | solanaRewardsManagerTokenPDA=FRk4j95RG2kSk3BHXBPVgKszFc2rLQ8K6RS83k3dmzvQ 33 | registryAddress=0xCfEB869F69431e42cdB54A4F4f105C19C080A601 34 | aaoAddress=0xF0D5BC18421fa04D0a2A2ef540ba5A9f04014BE3 35 | ethRegistryAddress=0xABbfF712977dB51f9f212B85e8A4904c818C2b63 36 | userVerifierPublicKey=0xbbbb93A6B3A1D6fDd27909729b95CCB0cc9002C0' 37 | web3Provider=http://acdc-ganache.devnet.audius-d 38 | solanaEndpoint=http://solana-test-validator.devnet.audius-d 39 | ethOwnerWallet=0x855FA758c77D68a04990E992aA4dcdeF899F654A 40 | solanaTrackListenCountAddress=testEjzEibm3nq77VQcqCCmSMx6m3KdJHuepBH1rnue 41 | dbUrl=postgres://postgres:postgres@db:5432/postgres 42 | aaoEndpoint=https://anti-abuse.devnet.audius-d 43 | solanaUSDCMintAddress=26Q7gP8UfkDzi7GMFEQxTJaNJ8D2ybCUjex58M5MLu8y 44 | solanaPaymentRouterProgramId=apaySbqV1XAmuiGszeN4NyWrXkkMrnuJVoNhzmS1AMa 45 | -------------------------------------------------------------------------------- /identity-service/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | # used by audius-d devnet 4 | x-extra-hosts: &extra-hosts 5 | extra_hosts: 6 | - "creator-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 7 | - "discovery-1.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 8 | - "identity.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 9 | - "eth-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 10 | - "acdc-ganache.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 11 | - "solana-test-validator.devnet.audius-d:${HOST_DOCKER_INTERNAL:-172.100.0.1}" 12 | 13 | services: 14 | db: 15 | container_name: postgres 16 | extends: 17 | file: ../common-services.yml 18 | service: base-postgres 19 | environment: 20 | POSTGRES_DB: audius_identity_service 21 | volumes: 22 | - /var/k8s/identity-service-db:/var/lib/postgresql/data # Use k8s location for consistency 23 | networks: 24 | - identity-service-network 25 | 26 | cache: 27 | container_name: redis 28 | extends: 29 | file: ../common-services.yml 30 | service: base-redis 31 | networks: 32 | - identity-service-network 33 | 34 | backend: 35 | image: audius/identity-service:${TAG:-current} 36 | container_name: server 37 | <<: *extra-hosts 38 | depends_on: 39 | db: 40 | condition: service_healthy 41 | cache: 42 | condition: service_healthy 43 | labels: 44 | autoheal: "true" 45 | ports: 46 | - "7000:7000" 47 | env_file: 48 | - ${NETWORK}.env 49 | - ${OVERRIDE_PATH:-override.env} 50 | networks: 51 | - identity-service-network 52 | 53 | autoheal: 54 | image: willfarrell/autoheal 55 | container_name: autoheal 56 | volumes: 57 | - '/var/run/docker.sock:/var/run/docker.sock' 58 | environment: 59 | - AUTOHEAL_INTERVAL=300 60 | - CURL_TIMEOUT=300 61 | 62 | vector: 63 | extends: 64 | file: ../common-services.yml 65 | service: vector 66 | env_file: 67 | - ${NETWORK:-prod}.env 68 | - ${OVERRIDE_PATH:-override.env} 69 | networks: 70 | - identity-service-network 71 | 72 | networks: 73 | identity-service-network: 74 | -------------------------------------------------------------------------------- /identity-service/prod.env: -------------------------------------------------------------------------------- 1 | logLevel=info 2 | 3 | dbUrl=postgres://postgres:postgres@db:5432/postgres 4 | 5 | redisHost=cache 6 | redisPort=6379 7 | 8 | acdcChainId=31524 9 | aaoAddress=0x9811BA3eAB1F2Cd9A2dFeDB19e8c2a69729DC8b6 10 | aaoEndpoint=https://antiabuseoracle.audius.co 11 | generalAdmissionAddress=https://general-admission.audius.co 12 | amplitudeAPIKey=86760558b8bb1b3aae61656efd4ddacb 13 | blacklisterPublicKey=0xfeebEA99dE524ac668B6f151177EcA60b30A09c9 14 | cognitoBaseUrl=https://api.cognitohq.com 15 | cognitoTemplateId=flwtmp_eMMe8VQGrKvLCX 16 | entityManagerAddress=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 17 | ethBridgeAddress=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B 18 | ethOwnerWallet=0x3eC41B55D9A1Edd593Ef38493d8125DeB4EE03a9 19 | ethRegistryAddress=0xa0fd5C42F81CC35aa66E5f8Ee85098fF7D669fa6 20 | ethTokenAddress=0x2999e02829DC711B9254187962ba44d1fFcf5481 21 | ethTokenBridgeAddress=0x3ee18B2214AFF97000D974cf647E7C347E8fa585 22 | minimumBalance=25 23 | registryAddress=0x65D2F689a0ea3A5D1Ee97f7F8f3a9549860b9Ed5 24 | relayerPublicKey=0xdead88167Bd06Cbc251FB8336B44259c6407dd07 25 | rewardsParallelization=10 26 | rewardsQuorumSize=3 27 | secondaryWeb3Provider=https://core.poa.network 28 | solBridgeAddress=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth 29 | solTokenBridgeAddress=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb 30 | solanaClaimableTokenProgramAddress=Ewkv3JahEFRKkcJmpoKB7pXbnUHwjAyXiwEo4ZY2rezQ 31 | solanaMintAddress=9LzCMqDgTKYz9Drzqnpgee3SGa89up3a247ypMj2xrqM 32 | solanaUSDCMintAddress=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 33 | solanaRewardsManagerProgramId=DDZDcYdQFEMwcu2Mwo75yGFjJ1mUQyyXLWzhZLEVFcei 34 | solanaRewardsManagerProgramPDA=71hWFVYokLaN1PNYzTAWi13EfJ7Xt9VbSWUKsXUT8mxE 35 | solanaRewardsManagerTokenPDA=3V9opXNpHmPPymKeq7CYD8wWMH8wzFXmqEkNdzfsZhYq 36 | solanaPaymentRouterProgramId=paytYpX3LPN98TAeen6bFFeraGSuWnomZmCXjAsoqPa 37 | coinflowProgramId=FD1amxhTsDpwzoVX41dxp2ygAESURV2zdUACzxM1Dfw9 38 | userVerifierPublicKey=0xbeef8E42e8B5964fDD2b7ca8efA0d9aef38AA996 39 | web3Provider=https://acdc-gateway.audius.co 40 | wormholeRPCHosts=https://wormhole-v2-mainnet-api.certus.one,https://wormhole.inotel.ro,https://wormhole-v2-mainnet-api.mcf.rocks,https://wormhole-v2-mainnet-api.chainlayer.network,https://wormhole-v2-mainnet-api.staking.fund,https://wormhole-v2-mainnet-api.chainlayer.network 41 | skipAbuseCheck=false 42 | 43 | ethProviderUrl= 44 | mailgunApiKey= 45 | rateLimitingListensIPWhitelist= 46 | twitterAPIKey= 47 | 48 | # logging 49 | audius_axiom_dataset=identity -------------------------------------------------------------------------------- /identity-service/stage.env: -------------------------------------------------------------------------------- 1 | logLevel=info 2 | 3 | dbUrl=postgres://postgres:postgres@db:5432/postgres 4 | 5 | redisHost=cache 6 | redisPort=6379 7 | 8 | acdcChainId=1056801 9 | aaoAddress=0x00b6462e955dA5841b6D9e1E2529B830F00f31Bf 10 | aaoEndpoint=https://antiabuseoracle.staging.audius.co 11 | generalAdmissionAddress=https://general-admission.staging.audius.co 12 | amplitudeAPIKey=72a58ce4ad1f9bafcba0b92bedb6c33d 13 | blacklisterPublicKey=0xcccc36bE44D106C6aC14199A2Ed6a29fDa25d5Ae 14 | entityManagerAddress=0x1Cd8a543596D499B9b6E7a6eC15ECd2B7857Fd64 15 | ethOwnerWallet= 16 | ethRegistryAddress=0xc682C2166E11690B64338e11633Cb8Bb60B0D9c0 17 | ethTokenAddress=0x1376180Ee935AA64A27780F4BE97726Df7B0e2B2 18 | minimumBalance=10 19 | registryAddress=0x793373aBF96583d5eb71a15d86fFE732CD04D452 20 | relayerPublicKey=0x01083881956D45146CdB79b88ecB45C6dFbC5B8B 21 | userVerifierPublicKey=0xbbbb93A6B3A1D6fDd27909729b95CCB0cc9002C0 22 | web3Provider=https://acdc-gateway.staging.audius.co 23 | solanaPaymentRouterProgramId=sp28KA2bTnTA4oSZ3r9tTSKfmiXZtZQHnYYQqWfUyVa 24 | coinflowProgramId=FD1amxhTsDpwzoVX41dxp2ygAESURV2zdUACzxM1Dfw9 25 | skipAbuseCheck=true 26 | solanaMintAddress=9LzCMqDgTKYz9Drzqnpgee3SGa89up3a247ypMj2xrqM 27 | solanaUSDCMintAddress=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 28 | 29 | ethNetworkId=11155111 30 | ethProviderUrl=https://eth.staging.audius.co 31 | mailgunApiKey= 32 | rateLimitingListensIPWhitelist= 33 | twitterAPIKey= 34 | entityManagerReplicaSetEnabled=true 35 | 36 | # logging 37 | audius_axiom_dataset=stage-identity 38 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | set -e 3 | 4 | if [ ! -d ~/audius-docker-compose ] 5 | then 6 | # if not called via 7 | # `bash <(curl https://raw.githubusercontent.com/AudiusProject/audius-docker-compose/main/install.sh)` 8 | git clone --single-branch --branch main https://github.com/AudiusProject/audius-docker-compose.git ~/audius-docker-compose 9 | fi 10 | 11 | while read -p "Service to install (creator-node, discovery-provider, ddex): "; do 12 | if [[ $REPLY =~ ^(creator-node|discovery-provider|identity-service|ddex)$ ]]; then 13 | break 14 | fi 15 | echo "Invalid service name" 16 | done 17 | 18 | ~/audius-docker-compose/setup.sh $REPLY 19 | -------------------------------------------------------------------------------- /ops/README.md: -------------------------------------------------------------------------------- 1 | 2 | # node ops 3 | 4 | ## migrate from rds to postgres container 5 | 6 | ``` 7 | cd audius-docker-compose/creator-node 8 | audius-cli down 9 | docker compose -f ops/docker-compose-pgonly.yml up -d 10 | ``` 11 | 12 | dump data from db 13 | ``` 14 | docker exec -ti postgres bash 15 | pg_dump -v --no-owner $dbUrl > /creator-node-db-backup/cn-db-latest.sql 16 | ``` 17 | 18 | stop postgres 19 | ``` 20 | docker compose -f ops/docker-compose-pgonly.yml down 21 | ``` 22 | 23 | remove anything in local pgdata dir 24 | ``` 25 | sudo rm -rf /var/k8s/creator-node-db 26 | sudo mkdir /var/k8s/creator-node-db 27 | ``` 28 | 29 | comment out or remove any previous rds config 30 | ``` 31 | cat ~/audius-docker-compose/creator-node/override.env 32 | # dbUrl= 33 | ``` 34 | 35 | re up and restore from backup 36 | ``` 37 | docker compose -f ops/docker-compose-pgonly.yml up -d 38 | docker exec -ti postgres bash 39 | psql -U postgres -d audius_creator_node < /creator-node-db-backup/cn-db-latest.sql 40 | # may need to add any required roles if it fails i.e. 41 | CREATE ROLE rdsadmin; 42 | ``` 43 | 44 | down pgonly and up creator node 45 | ``` 46 | docker compose -f ops/docker-compose-pgonly.yml down 47 | audius-cli launch creator-node -y 48 | ``` 49 | 50 | cleanup 51 | ``` 52 | sudo rm -f /var/k8s/creator-node-db-backup/cn-db-latest.sql 53 | ``` 54 | -------------------------------------------------------------------------------- /ops/docker-compose-pgonly.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | services: 4 | db: 5 | container_name: postgres 6 | extends: 7 | file: ../common-services.yml 8 | service: base-postgres 9 | environment: 10 | POSTGRES_DB: audius_creator_node 11 | env_file: 12 | - ${NETWORK:-prod}.env 13 | - ${OVERRIDE_PATH:-override.env} 14 | volumes: 15 | - /var/k8s/creator-node-db:/var/lib/postgresql/data 16 | - /var/k8s/creator-node-db-backup:/creator-node-db-backup 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | click==8.1.2 2 | psutil==5.9.0 3 | python-dotenv==0.20.0 4 | python-crontab==2.6.0 5 | web3==6.6.1 6 | setuptools==72.1.0 7 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | set -e # exit on error 4 | 5 | # set current directory to script directory 6 | cd "$(dirname "$0")" 7 | 8 | # upgrade the system 9 | export DEBIAN_FRONTEND=noninteractive 10 | 11 | sudo apt-get update -y 12 | sudo apt-get dist-upgrade -y 13 | sudo apt-get upgrade -y 14 | sudo apt-get install -y ca-certificates curl gnupg lsb-release jq 15 | 16 | # install docker 17 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 18 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null 19 | sudo apt-get update -y 20 | sudo apt-get install -y docker-ce docker-ce-cli containerd.io 21 | sudo systemctl start docker 22 | 23 | # limit log size in docker 24 | cat </dev/null 25 | { 26 | "log-driver": "json-file", 27 | "log-opts": { 28 | "max-size": "10m", 29 | "max-file": "3" 30 | } 31 | } 32 | EOF 33 | 34 | # allow current user to use docker without sudo 35 | sudo usermod -aG docker $USER 36 | sudo chmod 666 /var/run/docker.sock 37 | 38 | # install docker-compose 39 | DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} 40 | mkdir -p $DOCKER_CONFIG/cli-plugins 41 | curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose 42 | chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose 43 | 44 | # create directories for volumes 45 | sudo mkdir -p /var/k8s 46 | sudo chown $(id -u):$(id -g) /var/k8s 47 | 48 | # audius-cli setup 49 | sudo apt install -y python3 python3-pip 50 | sudo python3 -m pip install -r requirements.txt 51 | sudo ln -sf $PWD/audius-cli /usr/local/bin/audius-cli 52 | echo 'eval "$(_AUDIUS_CLI_COMPLETE=bash_source audius-cli)"' >>~/.bashrc 53 | touch creator-node/override.env 54 | touch creator-node/.env 55 | touch discovery-provider/override.env 56 | touch discovery-provider/.env 57 | touch identity-service/override.env 58 | touch identity-service/.env 59 | touch ddex/override.env 60 | touch ddex/.env 61 | 62 | keyfile_path="ddex/mongo-keyfile" 63 | if [ ! -f "$keyfile_path" ]; then 64 | openssl rand -base64 756 > "$keyfile_path" 65 | chmod 400 "$keyfile_path" 66 | fi 67 | 68 | # check if ubuntu version is 20.04 or 22.04 69 | UBUNTU_VERSION=$(cat /etc/os-release | grep VERSION_ID) 70 | if [[ ! $UBUNTU_VERSION =~ 20.04|22.04 ]]; then 71 | echo "Unsupported version of Ubuntu, please run version 20.04 or 22.04" 72 | read -p "Continue with setup? [Y/n] " -n 1 -r 73 | echo $REPLY 74 | if [[ "$REPLY" =~ ^(Nn]|)$ ]]; then 75 | exit 1 76 | fi 77 | fi 78 | 79 | # check if ubuntu kernel version is 5.10+ 80 | UBUNTU_KERNEL_VERSION=$(uname -r) 81 | if [[ ! $UBUNTU_KERNEL_VERSION =~ 5\.[1-9][0-9] ]]; then 82 | echo "Unsupported version of Ubuntu kernel, please run version 5.13 or higher" 83 | read -p "Continue with setup? [Y/n] " -n 1 -r 84 | echo 85 | if [[ "$REPLY" =~ ^([Nn]|)$ ]]; then 86 | exit 1 87 | fi 88 | fi 89 | 90 | # setup service 91 | if [[ "$1" != "" ]]; then 92 | read -p "Enable auto upgrade? [Y/n] " -n 1 -r 93 | echo 94 | if [[ "$REPLY" =~ ^([Yy]|)$ ]]; then 95 | audius-cli auto-upgrade 96 | fi 97 | 98 | audius-cli set-config --required "$1" 99 | 100 | read -p "Launch the service? [Y/n] " -n 1 -r 101 | echo 102 | if [[ "$REPLY" =~ ^([Yy]|)$ ]]; then 103 | if [[ "$1" == "discovery-provider" ]]; then 104 | read -p "Seed discovery db from snapshot (takes ~1 hour)? [Y/n] " -n 1 -r 105 | echo 106 | if [[ "$REPLY" =~ ^([Yy]|)$ ]]; then 107 | extra_args="--seed" 108 | fi 109 | fi 110 | audius-cli launch $extra_args "$1" # do not pass --yes so that we check for machine requirements 111 | fi 112 | fi 113 | 114 | # reboot machine 115 | read -p "Reboot Machine? [Y/n] " -n 1 -r 116 | echo 117 | if [[ ! "$REPLY" =~ ^([Yy]|)$ ]]; then 118 | exit 1 119 | fi 120 | 121 | sudo reboot 122 | -------------------------------------------------------------------------------- /test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AudiusProject/audius-docker-compose/4f1ecaf1aae0ee6597a82a0b780431dbfd07f494/test.txt -------------------------------------------------------------------------------- /utilities/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.17.0 -------------------------------------------------------------------------------- /utilities/README.md: -------------------------------------------------------------------------------- 1 | # Service Provider Utilities 2 | 3 | This project is a set of common scripts and utilities to manage services. 4 | 5 | ## Setup 6 | 7 | ``` 8 | npm install 9 | ``` 10 | 11 | ## Discovery Node 12 | 13 | ### Health Checks 14 | 15 | Run before registering your service to ensure it complies with network specs: 16 | ``` 17 | export discoveryProviderEndpoint=https://discoveryprovider.domain.co 18 | 19 | npm run discovery:health 20 | ``` 21 | 22 | ## Creator Node 23 | 24 | ### Health Checks 25 | 26 | Run before registering your service to ensure it complies with network specs: 27 | ``` 28 | export creatorNodeEndpoint=https://creatornode.domain.co 29 | export delegatePrivateKey=5e468bc1b395e2eb8f3c90ef897406087b0599d139f6ca0060ba85dcc0dce8dc 30 | export spId=1 # if your node is not registered, set this env var to empty 31 | 32 | npm run creator:health 33 | ``` 34 | 35 | ### Delist Content 36 | 37 | If you'd like to manually delist or undelist content on your node, run this script after ensuring the necessary env vars are set: 38 | ``` 39 | export creatorNodeEndpoint=https://creatornode.domain.co 40 | export delegatePrivateKey=5e468bc1b395e2eb8f3c90ef897406087b0599d139f6ca0060ba85dcc0dce8dc 41 | export discoveryProviderEndpoint=https://discoveryprovider.domain.co 42 | npm run creator:delist track 1,abcde,3 43 | npm run creator:undelist user 4,fghij,5 44 | ``` 45 | 46 | ## Automatic claims 47 | 48 | If you would like to automatically run claim operations whenever a new round is initiated, `claim.js` is included for your convenience in the claim folder. 49 | 50 | See [README](./claim) -------------------------------------------------------------------------------- /utilities/claim/ERC20Splitter.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_token", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_recipient1", 12 | "type": "address" 13 | }, 14 | { 15 | "internalType": "address", 16 | "name": "_recipient2", 17 | "type": "address" 18 | }, 19 | { 20 | "internalType": "uint256", 21 | "name": "_percentage", 22 | "type": "uint256" 23 | } 24 | ], 25 | "stateMutability": "nonpayable", 26 | "type": "constructor" 27 | }, 28 | { 29 | "inputs": [], 30 | "name": "percentage", 31 | "outputs": [ 32 | { 33 | "internalType": "uint256", 34 | "name": "", 35 | "type": "uint256" 36 | } 37 | ], 38 | "stateMutability": "view", 39 | "type": "function" 40 | }, 41 | { 42 | "inputs": [], 43 | "name": "recipient1", 44 | "outputs": [ 45 | { 46 | "internalType": "address", 47 | "name": "", 48 | "type": "address" 49 | } 50 | ], 51 | "stateMutability": "view", 52 | "type": "function" 53 | }, 54 | { 55 | "inputs": [], 56 | "name": "recipient2", 57 | "outputs": [ 58 | { 59 | "internalType": "address", 60 | "name": "", 61 | "type": "address" 62 | } 63 | ], 64 | "stateMutability": "view", 65 | "type": "function" 66 | }, 67 | { 68 | "inputs": [], 69 | "name": "token", 70 | "outputs": [ 71 | { 72 | "internalType": "contract IERC20", 73 | "name": "", 74 | "type": "address" 75 | } 76 | ], 77 | "stateMutability": "view", 78 | "type": "function" 79 | }, 80 | { 81 | "inputs": [], 82 | "name": "transfer", 83 | "outputs": [], 84 | "stateMutability": "nonpayable", 85 | "type": "function" 86 | } 87 | ] -------------------------------------------------------------------------------- /utilities/claim/EthRewardsManager.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "constant": false, 4 | "inputs": [], 5 | "name": "initialize", 6 | "outputs": [], 7 | "payable": false, 8 | "stateMutability": "nonpayable", 9 | "type": "function" 10 | }, 11 | { 12 | "constant": false, 13 | "inputs": [ 14 | { 15 | "internalType": "address", 16 | "name": "_tokenAddress", 17 | "type": "address" 18 | }, 19 | { 20 | "internalType": "address", 21 | "name": "_governanceAddress", 22 | "type": "address" 23 | }, 24 | { 25 | "internalType": "address", 26 | "name": "_wormholeAddress", 27 | "type": "address" 28 | }, 29 | { 30 | "internalType": "bytes32", 31 | "name": "_recipient", 32 | "type": "bytes32" 33 | }, 34 | { 35 | "internalType": "address[]", 36 | "name": "_antiAbuseOracleAddresses", 37 | "type": "address[]" 38 | } 39 | ], 40 | "name": "initialize", 41 | "outputs": [], 42 | "payable": false, 43 | "stateMutability": "nonpayable", 44 | "type": "function" 45 | }, 46 | { 47 | "constant": false, 48 | "inputs": [ 49 | { 50 | "internalType": "address", 51 | "name": "_governanceAddress", 52 | "type": "address" 53 | } 54 | ], 55 | "name": "setGovernanceAddress", 56 | "outputs": [], 57 | "payable": false, 58 | "stateMutability": "nonpayable", 59 | "type": "function" 60 | }, 61 | { 62 | "constant": false, 63 | "inputs": [ 64 | { 65 | "internalType": "bytes32", 66 | "name": "_recipient", 67 | "type": "bytes32" 68 | } 69 | ], 70 | "name": "setRecipientAddress", 71 | "outputs": [], 72 | "payable": false, 73 | "stateMutability": "nonpayable", 74 | "type": "function" 75 | }, 76 | { 77 | "constant": false, 78 | "inputs": [ 79 | { 80 | "internalType": "address[]", 81 | "name": "_antiAbuseOracleAddresses", 82 | "type": "address[]" 83 | } 84 | ], 85 | "name": "setAntiAbuseOracleAddresses", 86 | "outputs": [], 87 | "payable": false, 88 | "stateMutability": "nonpayable", 89 | "type": "function" 90 | }, 91 | { 92 | "constant": false, 93 | "inputs": [ 94 | { 95 | "internalType": "uint256", 96 | "name": "arbiterFee", 97 | "type": "uint256" 98 | }, 99 | { 100 | "internalType": "uint32", 101 | "name": "_nonce", 102 | "type": "uint32" 103 | } 104 | ], 105 | "name": "transferToSolana", 106 | "outputs": [], 107 | "payable": false, 108 | "stateMutability": "nonpayable", 109 | "type": "function" 110 | }, 111 | { 112 | "constant": true, 113 | "inputs": [], 114 | "name": "token", 115 | "outputs": [ 116 | { 117 | "internalType": "address", 118 | "name": "", 119 | "type": "address" 120 | } 121 | ], 122 | "payable": false, 123 | "stateMutability": "view", 124 | "type": "function" 125 | }, 126 | { 127 | "constant": true, 128 | "inputs": [], 129 | "name": "getGovernanceAddress", 130 | "outputs": [ 131 | { 132 | "internalType": "address", 133 | "name": "", 134 | "type": "address" 135 | } 136 | ], 137 | "payable": false, 138 | "stateMutability": "view", 139 | "type": "function" 140 | }, 141 | { 142 | "constant": true, 143 | "inputs": [], 144 | "name": "getRecipientAddress", 145 | "outputs": [ 146 | { 147 | "internalType": "bytes32", 148 | "name": "", 149 | "type": "bytes32" 150 | } 151 | ], 152 | "payable": false, 153 | "stateMutability": "view", 154 | "type": "function" 155 | }, 156 | { 157 | "constant": true, 158 | "inputs": [], 159 | "name": "getAntiAbuseOracleAddresses", 160 | "outputs": [ 161 | { 162 | "internalType": "address[]", 163 | "name": "", 164 | "type": "address[]" 165 | } 166 | ], 167 | "payable": false, 168 | "stateMutability": "view", 169 | "type": "function" 170 | } 171 | ] -------------------------------------------------------------------------------- /utilities/claim/README.md: -------------------------------------------------------------------------------- 1 | # Automatic claims 2 | 3 | If you would like to automatically claim rewards when a new rewards round is initiated, follow these instructions to run `claim.js`. 4 | 5 | This script can run on a recurring basis via cron and takes in two command line arguments: `spOwnerWallet` and `privateKey`. 6 | 7 | `spOwnerWallet` - The wallet address used to register the nodes 8 | 9 | `privateKey` - Not the private key of the `spOwnerWallet`. Should be a throwaway wallet used exclusively to claim with just enough ETH to make claims, no more than 1 ETH at any given time with an alert to top up. 10 | 11 | Claiming rewards is permissionless. Any wallet can make a claim on behalf of any node operator and their delegators and the rewards will be distributed to the node operator and the delegators inside the staking system and not to the wallet performing the claim. In order to access the claim, the node operator or delegator would have to request to undelegate. 12 | 13 | ``` 14 | cd utilities 15 | npm install 16 | 17 | node claim/claim.js claim-rewards --eth-rpc-endpoint= 18 | 19 | # Then you can run the following command to setup a cron job. (Be sure to replace the full path to `claim.js`) 20 | (crontab -l 2>/dev/null; echo "0 */6 * * * node full/path/to/claim.js claim-rewards --eth-rpc-endpoint=") | crontab - 21 | ``` 22 | 23 | Be sure to replace `full/path/to/claim.js` with the actual path on your local machine. 24 | 25 | 26 | ``` 27 | Usage: claim [options] [command] 28 | 29 | Options: 30 | -h, --help display help for command 31 | 32 | Commands: 33 | initiate-round [options] Initiates new round for claiming rewards 34 | claim-rewards [options] Claim rewards for given spOwnerWallet 35 | help [command] display help for command 36 | ``` 37 | 38 | ## Initiate a reward round 39 | May be performed every epoch (once every N blocks determined by the governance system). 40 | At launch, set to 7 days. Each node operator may claim once per round. 41 | 42 | ``` 43 | Usage: claim initiate-round [options] 44 | 45 | Initiates new round for claiming rewards 46 | 47 | Options: 48 | --eth-registry-address Registry contract address (default: "0xd976d3b4f4e22a238c1A736b6612D22f17b6f64C") 49 | --eth-token-address Token contract address (default: "0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998") 50 | --eth-rpc-endpoint Eth web3 rpc url to use 51 | --gas ammount of gas to use (default: 100000) 52 | --gas-price gas price in gwei 53 | -h, --help display help for command 54 | ``` 55 | 56 | ## Claim rewards 57 | Claim rewards for given spOwnerWallet. 58 | 59 | ``` 60 | Usage: claim claim-rewards [options] 61 | 62 | Options: 63 | --eth-registry-address Registry contract address (default: "0xd976d3b4f4e22a238c1A736b6612D22f17b6f64C") 64 | --eth-token-address Token contract address (default: "0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998") 65 | --eth-rpc-endpoint Eth web3 rpc url to use 66 | --solana-rpc-endpoint Solana rpc url to use 67 | --gas ammount of gas to use (default: 1000000) 68 | --gas-price gas price in gwei 69 | -h, --help display help for command 70 | ``` 71 | -------------------------------------------------------------------------------- /utilities/claim/claim.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const Web3 = require('web3') 3 | const HDWalletProvider = require('@truffle/hdwallet-provider') 4 | const { program } = require('commander') 5 | const BN = require('bn.js') 6 | const fs = require('fs') 7 | const path = require('path') 8 | const audius = require('@audius/libs') 9 | 10 | const defaultRegistryAddress = '0xd976d3b4f4e22a238c1A736b6612D22f17b6f64C' 11 | const defaultTokenAddress = '0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998' 12 | const splitterAddress = '0x69eaacad9c08bf3a809688395a5f2f0ccac5aa0d' 13 | const splitterABI = require('./ERC20Splitter.json') 14 | const ethRewardsManagerAddress = '0x5aa6B99A2B461bA8E97207740f0A689C5C39C3b0' 15 | const ethRewardsManagerABI = require('./EthRewardsManager.json') 16 | const { Wormhole, wormhole, signSendWait } = require('@wormhole-foundation/sdk') 17 | const { Connection } = require('@solana/web3.js') 18 | const solana = require('@wormhole-foundation/sdk/solana').default 19 | const evm = require('@wormhole-foundation/sdk/evm').default 20 | 21 | async function configureLibs(ethRegistryAddress, ethTokenAddress, ethRpcEndpoint) { 22 | const configuredWeb3 = await audius.Utils.configureWeb3(ethRpcEndpoint, null, false) 23 | 24 | const audiusLibsConfig = { 25 | ethWeb3Config: audius.configEthWeb3(ethTokenAddress, ethRegistryAddress, configuredWeb3, '0x0'), 26 | isServer: true, 27 | } 28 | 29 | const libs = new audius(audiusLibsConfig) 30 | await libs.init() 31 | 32 | return libs 33 | } 34 | 35 | async function getClaimsManagerContract(ethRegistryAddress, ethTokenAddress, web3) { 36 | const audiusLibs = await configureLibs(ethRegistryAddress, ethTokenAddress, web3.eth.currentProvider) 37 | await audiusLibs.ethContracts.ClaimsManagerClient.init() 38 | return new web3.eth.Contract( 39 | audiusLibs.ethContracts.ClaimsManagerClient._contract.options.jsonInterface, 40 | audiusLibs.ethContracts.ClaimsManagerClient._contract.options.address 41 | ) 42 | } 43 | 44 | async function getDelegateManagerContract(ethRegistryAddress, ethTokenAddress, web3) { 45 | const audiusLibs = await configureLibs(ethRegistryAddress, ethTokenAddress, web3.eth.currentProvider) 46 | await audiusLibs.ethContracts.DelegateManagerClient.init() 47 | return new web3.eth.Contract( 48 | audiusLibs.ethContracts.DelegateManagerClient._contract.options.jsonInterface, 49 | audiusLibs.ethContracts.DelegateManagerClient._contract.options.address 50 | ) 51 | } 52 | 53 | async function getEthRewardsManagerContract(ethRegistryAddress, ethTokenAddress, web3) { 54 | const audiusLibs = await configureLibs(ethRegistryAddress, ethTokenAddress, web3.eth.currentProvider) 55 | return new web3.eth.Contract( 56 | ethRewardsManagerABI, 57 | ethRewardsManagerAddress 58 | ) 59 | } 60 | 61 | async function balanceOf(ethRegistryAddress, ethTokenAddress, web3, address) { 62 | const audiusLibs = await configureLibs(ethRegistryAddress, ethTokenAddress, web3.eth.currentProvider) 63 | return audiusLibs.ethContracts.AudiusTokenClient.balanceOf(address) 64 | } 65 | 66 | async function getSplitterContract(splitterAddress, web3) { 67 | return new web3.eth.Contract( 68 | splitterABI, 69 | splitterAddress 70 | ) 71 | } 72 | 73 | async function getWormholeSolanaSigner(chain, feePayerSecretKey, solanaRpcEndpoint) { 74 | const signer = (await ( 75 | await solana() 76 | ).getSigner(new Connection(solanaRpcEndpoint), feePayerSecretKey, { 77 | priorityFee: { 78 | // take the middle priority fee 79 | percentile: 0.5, 80 | // juice the base fee taken from priority fee percentile 81 | percentileMultiple: 2, 82 | // at least 1 lamport/compute unit 83 | min: 1, 84 | // at most 1000 lamport/compute unit 85 | max: 1000, 86 | }, 87 | sendOpts: { 88 | skipPreflight: true, 89 | }, 90 | })) 91 | return { 92 | signer, 93 | address: Wormhole.chainAddress(chain.chain, signer.address()), 94 | }; 95 | }; 96 | 97 | async function initiateRound(privateKey, { ethRegistryAddress, ethTokenAddress, ethRpcEndpoint, solanaRpcEndpoint, gas, gasPrice, transferRewardsToSolana }) { 98 | const web3 = new Web3( 99 | new HDWalletProvider({ 100 | privateKeys: [privateKey], 101 | providerOrUrl: ethRpcEndpoint, 102 | }) 103 | ) 104 | web3.eth.transactionPollingTimeout = 3600 105 | const accountAddress = web3.eth.accounts.privateKeyToAccount(privateKey).address 106 | 107 | const claimsManagerContract = await getClaimsManagerContract(ethRegistryAddress, ethTokenAddress, web3) 108 | 109 | const lastFundedBlock = await claimsManagerContract.methods.getLastFundedBlock().call() 110 | const requiredBlockDiff = await claimsManagerContract.methods.getFundingRoundBlockDiff().call() 111 | 112 | const currentBlock = await web3.eth.getBlockNumber() 113 | const blockDiff = currentBlock - lastFundedBlock - 12 114 | if (gasPrice === undefined) { 115 | gasPrice = await web3.eth.getGasPrice() 116 | console.log('Calculated Gas Price:', gasPrice) 117 | } 118 | 119 | console.log('\nInitiating Round\n================================\n') 120 | if (blockDiff > requiredBlockDiff) { 121 | if (gas === undefined) { 122 | console.log('Estimating Gas') 123 | gas = await claimsManagerContract.methods.initiateRound().estimateGas() 124 | console.log('Calculated Gas:', gas) 125 | } 126 | 127 | console.log('Initializing Round') 128 | await claimsManagerContract.methods.initiateRound().send({ 129 | from: accountAddress, 130 | gas, 131 | gasPrice 132 | }) 133 | console.log('Successfully initiated Round') 134 | } else { 135 | console.log(`Block difference of ${requiredBlockDiff} not met, ${requiredBlockDiff - blockDiff} blocks remaining`) 136 | } 137 | 138 | console.log('\nTransferring from splitter\n================================\n') 139 | // Transfer from the splitter to EthRewardsManager and Grants recipients 140 | const splitterContract = await getSplitterContract(splitterAddress, web3) 141 | const value = await balanceOf(ethRegistryAddress, ethTokenAddress, web3, splitterAddress) 142 | console.log(`Splitter holding ${value.div(new BN('1000000000000000000')).toString()} $AUDIO`) 143 | if (value.gt(new BN(0))) { 144 | console.log('Transferring from splitter to EthRewardsManager and Grants recipients') 145 | gas = await splitterContract.methods.transfer().estimateGas() 146 | await splitterContract.methods.transfer().send({ 147 | from: accountAddress, 148 | gas 149 | }) 150 | } else { 151 | console.log('No value to transfer from splitter') 152 | } 153 | 154 | const wormholeFile = path.join(__dirname, 'wormholeTransactions.txt') 155 | if (transferRewardsToSolana) { 156 | const feePayerSecretKey = process.env.FEE_PAYER_SECRET_KEY 157 | 158 | console.log('\nTransferring from EthRewardsManager to SolanaRewardsManager\n================================\n') 159 | const ethRewardsManagerContract = await getEthRewardsManagerContract(ethRegistryAddress, ethTokenAddress, web3) 160 | const value = await balanceOf(ethRegistryAddress, ethTokenAddress, web3, ethRewardsManagerAddress) 161 | console.log(`EthRewardsManager holding ${value.div(new BN('1000000000000000000')).toString()} $AUDIO`) 162 | console.log(value.toString()) 163 | // Check for minimum amount of $AUDIO to transfer. Sub 1 $AUDIO is possible because of wormhole dust / transfer minimums 164 | if (value.gt(new BN('1000000000000000000'))) { 165 | console.log('Transferring from EthRewardsManager to wormhole') 166 | const arbiterFee = 0 167 | const nonce = 2 168 | gas = await ethRewardsManagerContract.methods.transferToSolana(arbiterFee, nonce).estimateGas() 169 | const tx = await ethRewardsManagerContract.methods.transferToSolana(arbiterFee, nonce).send({ 170 | from: accountAddress, 171 | gas, 172 | gasPrice 173 | }) 174 | 175 | const txHash = tx.transactionHash 176 | console.log('Successfully transferred to wormhole, transaction:', txHash) 177 | // Append transaction hash to file 178 | fs.appendFileSync(wormholeFile, txHash + '\n') 179 | // Wait for 30 seconds to ensure the VAA is processed 180 | await new Promise((resolve) => setTimeout(resolve, 30_000)) 181 | } 182 | 183 | // Read and process all pending transactions 184 | let transactions = [] 185 | try { 186 | const transactions = fs.readFileSync(wormholeFile, 'utf8').split('\n').filter(Boolean) 187 | } catch (e) { 188 | console.error(`No ${wormholeFile} file found`) 189 | } 190 | let remainingTxs = transactions 191 | if (transactions.length === 0) { 192 | console.log('No transactions to redeem') 193 | } else { 194 | for (const pendingTxHash of transactions) { 195 | console.log('Redeeming wormhole funds on Solana for transaction:', pendingTxHash) 196 | const wh = await wormhole("Mainnet", [evm, solana]) 197 | const sendChain = wh.getChain("Ethereum") 198 | const receiveChain = wh.getChain("Solana") 199 | const tokenBridge = await receiveChain.getTokenBridge() 200 | const signer = await getWormholeSolanaSigner(receiveChain, feePayerSecretKey, solanaRpcEndpoint) 201 | const [whm] = await sendChain.parseTransaction(pendingTxHash) 202 | 203 | const oneHourInMs = 3600000 204 | 205 | let vaa = await wh.getVaa(whm, "TokenBridge:Transfer", oneHourInMs) 206 | let retryCount = 0 207 | while (!vaa) { 208 | logger.warn( 209 | { tx: pendingTxHash, retryCount: retryCount++ }, 210 | "No TokenBridgeTransfer VAA found, waiting and trying again..." 211 | ); 212 | await new Promise((resolve) => setTimeout(resolve, 1000)) 213 | vaa = await wh.getVaa(whm, "TokenBridge:Transfer", oneHourInMs) 214 | } 215 | const isComplete = await tokenBridge.isTransferCompleted(vaa) 216 | console.log(`Wormhole redemption completion status: ${isComplete}`) 217 | if (!isComplete) { 218 | const redeemTxs = tokenBridge.redeem(signer.address.address, vaa) 219 | const resRedeem = await signSendWait( 220 | receiveChain, 221 | redeemTxs, 222 | signer.signer 223 | ) 224 | } 225 | console.log('Wormhole redemption completed') 226 | 227 | // Remove completed transaction from file 228 | remainingTxs = remainingTxs.filter(tx => tx !== pendingTxHash) 229 | } 230 | fs.writeFileSync(wormholeFile, remainingTxs.join('\n') + (remainingTxs.length ? '\n' : '')) 231 | } 232 | } else { 233 | console.log('No value to transfer from EthRewardsManager') 234 | } 235 | } 236 | 237 | async function claimRewards( 238 | spOwnerWallet, 239 | privateKey, 240 | { ethRegistryAddress, ethTokenAddress, ethRpcEndpoint, gas, gasPrice } 241 | ) { 242 | const web3 = new Web3( 243 | new HDWalletProvider({ 244 | privateKeys: [privateKey], 245 | providerOrUrl: ethRpcEndpoint, 246 | }) 247 | ) 248 | 249 | web3.eth.transactionPollingTimeout = 3600 250 | const accountAddress = web3.eth.accounts.privateKeyToAccount(privateKey).address 251 | 252 | const claimsManagerContract = await getClaimsManagerContract(ethRegistryAddress, ethTokenAddress, web3) 253 | const delegateManagerContract = await getDelegateManagerContract(ethRegistryAddress, ethTokenAddress, web3) 254 | 255 | const claimPending = await claimsManagerContract.methods.claimPending(spOwnerWallet).call() 256 | 257 | if (claimPending) { 258 | if (gas === undefined) { 259 | console.log('Estimating Gas') 260 | gas = await delegateManagerContract.methods.claimRewards(spOwnerWallet).estimateGas() 261 | console.log('Calculated Gas:', gas) 262 | 263 | const gasPrice = await web3.eth.getGasPrice() 264 | const estimatedFee = gas * gasPrice 265 | console.log('Estimated Fee:', web3.utils.fromWei(estimatedFee.toString(), 'ether'), 'ETH') 266 | } 267 | 268 | console.log('Claiming Rewards') 269 | await delegateManagerContract.methods.claimRewards(spOwnerWallet).send({ 270 | from: accountAddress, 271 | gas, 272 | gasPrice: gasPrice ? web3.utils.toWei(gasPrice, 'gwei') : (await web3.eth.getGasPrice()), 273 | }) 274 | console.log('Claimed Rewards successfully') 275 | } else { 276 | console.log('No claims pending') 277 | } 278 | } 279 | 280 | async function main() { 281 | program 282 | .command('initiate-round ') 283 | .description('Initiates new round for claiming rewards') 284 | .requiredOption('--eth-rpc-endpoint ', 'Eth RPC endpoint') 285 | .requiredOption('--solana-rpc-endpoint ', 'Solana RPC endpoint') 286 | .option('--eth-registry-address ', 'Registry contract address', defaultRegistryAddress) 287 | .option('--eth-token-address ', 'Token contract address', defaultTokenAddress) 288 | .option('--gas ', 'amount of gas to use') 289 | .option('--gas-price ', 'gas price in gwei') 290 | .option('--transfer-rewards-to-solana', 'whether to also transfer rewards to solana rewards manager on success. Requires env vars to be set.', false) 291 | .action(initiateRound) 292 | 293 | program 294 | .command('claim-rewards ') 295 | .description('Claim rewards for given spOwnerWallet') 296 | .requiredOption('--eth-rpc-endpoint ', 'Eth RPC endpoint') 297 | .option('--eth-registry-address ', 'Registry contract address', defaultRegistryAddress) 298 | .option('--eth-token-address ', 'Token contract address', defaultTokenAddress) 299 | .option('--gas ', 'ammount of gas to use') 300 | .option('--gas-price ', 'gas price in gwei') 301 | .action(claimRewards) 302 | 303 | try { 304 | await program.parseAsync(process.argv) 305 | process.exit(0) 306 | } catch (e) { 307 | console.error(e) 308 | process.exit(1) 309 | } 310 | } 311 | 312 | main() 313 | -------------------------------------------------------------------------------- /utilities/creator-node/apiSigning.js: -------------------------------------------------------------------------------- 1 | const Web3 = require('web3') 2 | const web3 = new Web3() 3 | 4 | /** 5 | * Generate the timestamp and signature for api signing 6 | * @param {object} data 7 | * @param {string} privateKey 8 | */ 9 | const generateTimestampAndSignature = (data, privateKey) => { 10 | const timestamp = new Date().toISOString() 11 | const toSignObj = { ...data, timestamp } 12 | // JSON stringify automatically removes white space given 1 param 13 | const toSignStr = JSON.stringify(sortKeys(toSignObj)) 14 | const toSignHash = web3.utils.keccak256(toSignStr) 15 | const signedResponse = web3.eth.accounts.sign(toSignHash, privateKey) 16 | 17 | return { timestamp, signature: signedResponse.signature } 18 | } 19 | 20 | const generateSignature = (data, privateKey) => { 21 | // JSON stringify automatically removes white space given 1 param 22 | const toSignStr = JSON.stringify(sortKeys(data)) 23 | const toSignHash = web3.utils.keccak256(toSignStr) 24 | const signedResponse = web3.eth.accounts.sign(toSignHash, privateKey) 25 | 26 | return signedResponse.signature 27 | } 28 | 29 | const sortKeys = x => { 30 | if (typeof x !== 'object' || !x) { return x } 31 | if (Array.isArray(x)) { return x.map(sortKeys) } 32 | return Object.keys(x).sort().reduce((o, k) => ({ ...o, [k]: sortKeys(x[k]) }), {}) 33 | } 34 | 35 | const generateTimestampAndSignatureForSPVerification = (spID, privateKey) => { 36 | const spIdInt = parseInt(spID, 10) 37 | return generateTimestampAndSignature({ spID: spIdInt }, privateKey) 38 | } 39 | 40 | module.exports = { 41 | generateSignature, 42 | generateTimestampAndSignature, 43 | sortKeys, 44 | generateTimestampAndSignatureForSPVerification 45 | } 46 | -------------------------------------------------------------------------------- /utilities/creator-node/delistContent/hashIds.js: -------------------------------------------------------------------------------- 1 | const Hashids = require('hashids/cjs') 2 | 3 | class HashIds { 4 | constructor () { 5 | this.HASH_SALT = 'azowernasdfoia' 6 | this.MIN_LENGTH = 5 7 | this.hashids = new Hashids(this.HASH_SALT, this.MIN_LENGTH) 8 | } 9 | 10 | encode (id) { 11 | return this.hashids.encode([id]) 12 | } 13 | 14 | decode (id) { 15 | const ids = this.hashids.decode(id) 16 | if (!ids.length) return null 17 | return ids[0] 18 | } 19 | } 20 | 21 | module.exports = HashIds 22 | -------------------------------------------------------------------------------- /utilities/creator-node/delistContent/index.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const { program } = require('commander') 3 | const HashIds = require('./hashIds') 4 | const { generateSignature } = require('../apiSigning') 5 | 6 | // Required env variables 7 | const PRIVATE_KEY = process.env.delegatePrivateKey 8 | const CREATOR_NODE_ENDPOINT = process.env.creatorNodeEndpoint 9 | const DISCOVERY_PROVIDER_ENDPOINT = process.env.discoveryProviderEndpoint 10 | 11 | const hashIds = new HashIds() 12 | 13 | async function sendDelistRequest(entity, delisted) { 14 | if (entity.trackId) entity.trackId = parseInt(entity.trackId) 15 | if (entity.userId) entity.userId = parseInt(entity.userId) 16 | entity = { ...entity, delisted, timestamp: Date.now() } 17 | const signature = generateSignature(entity, PRIVATE_KEY) 18 | 19 | console.log(encodeURIComponent(JSON.stringify({ signature, data: JSON.stringify(entity) }))) 20 | try { 21 | await axios({ 22 | url: `${CREATOR_NODE_ENDPOINT}/delist_status/insert`, 23 | method: 'post', 24 | params: { signature: JSON.stringify({ signature, data: JSON.stringify(entity) }) }, 25 | data: entity, 26 | responseType: 'json', 27 | timeout: 3000, 28 | }) 29 | console.info(`Successfully set: ${JSON.stringify(entity)}`) 30 | } catch (e) { 31 | console.error(`Failed to set: ${JSON.stringify(entity)} because: ${e}`) 32 | } 33 | } 34 | 35 | const getIdType = (id) => { 36 | // Check if it's a CID (either v0 or v1) 37 | if ((id.startsWith('Qm') && id.length === 46) || (id.startsWith('ba') && id.length > 46)) { 38 | return 'CID' 39 | } 40 | 41 | // Check if it's an encoded id (alphanumeric and not all digits) 42 | if (/\D/.test(id) && /^[0-9a-zA-Z]+$/.test(id)) { 43 | return 'HASH_ID' 44 | } 45 | 46 | // Check if it's a decoded id (all digits) 47 | if (/^\d+$/.test(id)) { 48 | return 'ID' 49 | } 50 | 51 | return 'ERR' 52 | } 53 | 54 | async function getTrackInfo(trackId) { 55 | try { 56 | const resp = await axios({ 57 | url: `${DISCOVERY_PROVIDER_ENDPOINT}/tracks`, 58 | method: 'get', 59 | params: { id: trackId }, 60 | responseType: 'json', 61 | timeout: 3000, 62 | }) 63 | return { trackId, trackCid: resp.data.data[0].track_cid, ownerId: resp.data.data[0].owner_id } 64 | } catch (e) { 65 | console.log(`Not changing delist status for track because we failed to retrieve its info (trackId: ${trackId}): ${e}`) 66 | } 67 | } 68 | 69 | // We currently just delist the track and the user separately. 70 | // async function getTracksForUser(userId) { 71 | // const resp = await axios({ 72 | // url: `${DISCOVERY_PROVIDER_ENDPOINT}/tracks`, 73 | // method: 'get', 74 | // params: { user_id: userId }, 75 | // responseType: 'json', 76 | // timeout: 3000, 77 | // }) 78 | 79 | // return resp.data.data.map((track) => { 80 | // return { trackId: track.track_id, trackCid: track.track_cid, ownerId: track.owner_id } 81 | // }) 82 | // } 83 | 84 | async function setTrackDelisted(idStr, delisted) { 85 | const idType = getIdType(idStr) 86 | if (idType === 'ERR' || idType === 'CID') { 87 | console.error(`Invalid id: ${idStr}. Note that CIDs are not supported for delisting individual tracks.`) 88 | return 89 | } 90 | 91 | const trackId = idType === 'HASH_ID' ? hashIds.decode(idStr) : idStr 92 | const track = await getTrackInfo(trackId) 93 | if (track) await sendDelistRequest(track, delisted) 94 | } 95 | 96 | async function setUserDelisted(idStr, delisted) { 97 | const idType = getIdType(idStr) 98 | if (idType === 'ERR' || idType === 'CID') { 99 | console.error(`Invalid id: ${idStr}`) 100 | return 101 | } 102 | 103 | const userId = idType === 'HASH_ID' ? hashIds.decode(idStr) : idStr 104 | 105 | // We don't currently delist all tracks for a user, but the option is here 106 | // if (delisted) { 107 | // for (const track of await getTracksForUser(userId)) { 108 | // await sendDelistRequest(track, delisted) 109 | // } 110 | // } 111 | 112 | await sendDelistRequest({ userId }, delisted) 113 | } 114 | 115 | async function setAllDelisted(trackOrUser, ids, delisted) { 116 | const actions = { 117 | 'track': setTrackDelisted, 118 | 'user': setUserDelisted 119 | } 120 | const action = actions[trackOrUser] 121 | if (!action) { 122 | throw new Error(`Invalid type: ${trackOrUser}. Options are 'track' or 'user'`) 123 | } 124 | 125 | await Promise.all(ids.map(id => action(id, delisted))) 126 | } 127 | 128 | const COMMANDER_HELP_STRING = 129 | ` 130 | 131 | // Example usage: 132 | // node delistContent/index.js delist track 1,7eP5n 133 | // node delistContent/index.js delist user 1,ML51L 134 | // node delistContent/index.js undelist track 1,7eP5n 135 | // node delistContent/index.js undelist user 1,ML51L 136 | ` 137 | 138 | async function main() { 139 | program 140 | .command('delist ') 141 | .description(`Prevent content from being served by your content node.`) 142 | .usage(COMMANDER_HELP_STRING) 143 | .action(async (trackOrUser, ids) => setAllDelisted(trackOrUser.toLowerCase(), ids.split(','), true)) 144 | 145 | program 146 | .command('undelist ') 147 | .description(`Allow content to be served by your content node. When undelisting a user, you have to separately undelist the desired tracks.`) 148 | .usage(COMMANDER_HELP_STRING) 149 | .action(async (trackOrUser, ids) => setAllDelisted(trackOrUser.toLowerCase(), ids.split(','), false)) 150 | 151 | // Ensure env vars are set 152 | if (!CREATOR_NODE_ENDPOINT || !PRIVATE_KEY || !DISCOVERY_PROVIDER_ENDPOINT) { 153 | console.error(`Creator node endpoint [${CREATOR_NODE_ENDPOINT}], private key [${PRIVATE_KEY}], or discovery provider endpoint [${DISCOVERY_PROVIDER_ENDPOINT}] have not been exported.`) 154 | process.exit(1) 155 | } 156 | 157 | // Run the program 158 | try { 159 | await program.parseAsync(process.argv) 160 | process.exit(0) 161 | } catch (e) { 162 | console.error('Error running the script:', e) 163 | process.exit(1) 164 | } 165 | } 166 | 167 | main() 168 | -------------------------------------------------------------------------------- /utilities/creator-node/healthChecks.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const assert = require('assert') 3 | 4 | const PRIVATE_KEY = process.env.delegatePrivateKey 5 | const CREATOR_NODE_ENDPOINT = process.env.creatorNodeEndpoint 6 | const SP_ID = process.env.spId 7 | 8 | async function wait (milliseconds) { 9 | await new Promise((resolve) => 10 | setTimeout(resolve, milliseconds) 11 | ) 12 | } 13 | 14 | /** 15 | * Parses the environment variables and command line args 16 | * export creatorNodeEndpoint=http://creatornode.domain.com 17 | * export delegatePrivateKey=f0b743ce8adb7938f1212f188347a63... 18 | * NOTE: DO NOT PREFIX PRIVATE KEY WITH 0x 19 | */ 20 | function parseEnvVarsAndArgs () { 21 | if (!CREATOR_NODE_ENDPOINT || !PRIVATE_KEY) { 22 | let errorMsg = `creatorNodeEndpoint [${CREATOR_NODE_ENDPOINT}] or delegatePrivateKey [${PRIVATE_KEY}] have not been exported. ` 23 | errorMsg += "Please export environment variables 'delegatePrivateKey' (without leading 0x) and 'creatorNodeEndpoint' with https." 24 | throw new Error(errorMsg) 25 | } 26 | } 27 | 28 | async function healthCheck () { 29 | let requestConfig = { 30 | url: `${CREATOR_NODE_ENDPOINT}/health_check?allow_unregistered=true`, 31 | method: 'get', 32 | responseType: 'json' 33 | } 34 | let resp = await axios(requestConfig) 35 | let data = resp.data 36 | assert.deepStrictEqual(resp.status, 200) 37 | assert.deepStrictEqual(data.data.healthy, true) 38 | assert.ok( 39 | data.data.selectedDiscoveryProvider !== null && data.data.selectedDiscoveryProvider !== undefined, 40 | `Selected discovery provider should not be null or undefined` 41 | ) 42 | assert.ok( 43 | data.signature !== null && data.signature !== undefined, 44 | `Signature should not be null or undefined` 45 | ) 46 | assert.ok( 47 | data.data.spOwnerWallet !== null && data.data.spOwnerWallet !== undefined, 48 | `spOwnerWallet should not be null or undefined` 49 | ) 50 | console.log('✓ Health check passed') 51 | } 52 | 53 | async function run () { 54 | try { 55 | parseEnvVarsAndArgs() 56 | } catch (e) { 57 | console.error(`\nIncorrect script usage: ${e.message}`) 58 | process.exit(1) 59 | } 60 | try { 61 | console.log(`Checking health...`) 62 | await healthCheck() 63 | console.log("Health check passed!") 64 | process.exit(0) 65 | } catch (e) { 66 | console.error(`Error running script: ${e.message}`) 67 | process.exit(1) 68 | } 69 | } 70 | 71 | run() 72 | -------------------------------------------------------------------------------- /utilities/discovery-provider/healthChecks.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const assert = require('assert') 3 | const { WebSocket } = require('ws') 4 | 5 | const DISCOVERY_PROVIDER_ENDPOINT = process.env.discoveryProviderEndpoint 6 | 7 | /** 8 | * Parses the environment variables and command line args 9 | * export discoveryProviderEndpoint=http://discoveryprovider.domain.com 10 | */ 11 | function parseEnvVarsAndArgs() { 12 | if (!DISCOVERY_PROVIDER_ENDPOINT) { 13 | let errorMsg = `discoveryProviderEndpoint [${DISCOVERY_PROVIDER_ENDPOINT}] has not been exported. ` 14 | errorMsg += 15 | "Please export environment variable 'discoveryProviderEndpoint' with https." 16 | throw new Error(errorMsg) 17 | } 18 | } 19 | 20 | async function healthCheck() { 21 | const requestConfig = { 22 | url: `${DISCOVERY_PROVIDER_ENDPOINT}/health_check`, 23 | method: 'get', 24 | responseType: 'json', 25 | } 26 | const resp = await axios(requestConfig) 27 | const data = resp.data 28 | assert.deepStrictEqual( 29 | resp.status, 30 | 200, 31 | `Status code is ${resp.status}, not 200` 32 | ) 33 | assert.deepStrictEqual( 34 | data.data.db.number > 0, 35 | true, 36 | `DB number is ${data.data.db.number}, less than 0` 37 | ) 38 | assert.deepStrictEqual( 39 | data.data.block_difference < 5, 40 | true, 41 | `Block difference is ${data.data.block_difference}, greater than 5` 42 | ) 43 | console.log('✓ Health check passed successfully') 44 | } 45 | 46 | async function ipCheck() { 47 | const discoveryRequestConfig = { 48 | url: `${DISCOVERY_PROVIDER_ENDPOINT}/ip_check`, 49 | method: 'get', 50 | responseType: 'json', 51 | } 52 | const discoveryResp = await axios(discoveryRequestConfig) 53 | const discoveryClaimedIP = discoveryResp.data.data 54 | 55 | const ipApiRequestConfig = { 56 | url: 'https://ipapi.co/json', 57 | method: 'get', 58 | responseType: 'json', 59 | } 60 | const ipApiResp = await axios(ipApiRequestConfig) 61 | const ipApiClaimedIP = ipApiResp.data.ip 62 | 63 | assert.deepStrictEqual(discoveryResp.status, 200) 64 | assert.deepStrictEqual(ipApiResp.status, 200) 65 | assert.deepStrictEqual(discoveryClaimedIP, ipApiClaimedIP) 66 | console.log('✓ IP forwarding check passed successfully') 67 | } 68 | 69 | async function wsCheck() { 70 | return new Promise((resolve, reject) => { 71 | let endpoint = DISCOVERY_PROVIDER_ENDPOINT.replace('http', 'ws') 72 | endpoint = `${endpoint}/comms/debug/ws` 73 | const ws = new WebSocket(endpoint) 74 | 75 | ws.on('error', () => { 76 | console.log(`! websocket connection failed: ${endpoint}`) 77 | reject(new Error(`! websocket connection failed: ${endpoint}`)) 78 | }) 79 | 80 | ws.on('open', function open() { 81 | console.log(`✓ websocket OK: ${endpoint}`) 82 | resolve() 83 | }) 84 | }) 85 | } 86 | 87 | async function acdcPeerCheck() { 88 | const discoveryRequestConfig = { 89 | url: `${DISCOVERY_PROVIDER_ENDPOINT}/nethermind/peer`, 90 | method: 'get', 91 | responseType: 'json', 92 | } 93 | const discoveryResp = await axios(discoveryRequestConfig) 94 | assert.deepStrictEqual(discoveryResp.status, 200) 95 | assert.deepStrictEqual(discoveryResp.data.split('\n')?.[1], 'true') 96 | console.log('✓ acdc peering check') 97 | } 98 | 99 | async function run() { 100 | try { 101 | parseEnvVarsAndArgs() 102 | } catch (e) { 103 | console.error(`\nIncorrect script usage: ${e.message}`) 104 | process.exit(1) 105 | } 106 | try { 107 | await healthCheck() 108 | await ipCheck() 109 | await wsCheck() 110 | await acdcPeerCheck() 111 | console.log('All checks passed!') 112 | process.exit(0) 113 | } catch (e) { 114 | console.error(`Error running script: ${e.message}`) 115 | process.exit(1) 116 | } 117 | } 118 | 119 | run() 120 | -------------------------------------------------------------------------------- /utilities/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sp-actions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "author": "", 7 | "license": "Apache-2.0", 8 | "scripts": { 9 | "discovery:health": "node discovery-provider/healthChecks.js", 10 | "creator:health": "node creator-node/healthChecks.js", 11 | "creator:delist": " node creator-node/delistContent/index.js delist", 12 | "creator:undelist": " node creator-node/delistContent/index.js undelist", 13 | "claim:init-round": "node claim/claim.js initiate-round --transfer-rewards-to-solana" 14 | }, 15 | "dependencies": { 16 | "@audius/libs": "1.2.116", 17 | "@solana/web3.js": "^1.98.0", 18 | "@truffle/hdwallet-provider": "^1.2.2", 19 | "@wormhole-foundation/sdk": "^1.3.2", 20 | "axios": "^0.21.0", 21 | "commander": "^6.2.1", 22 | "form-data": "^3.0.0", 23 | "web3": "^1.3.4", 24 | "ws": "^8.13.0" 25 | }, 26 | "prettier": { 27 | "semi": false, 28 | "singleQuote": true 29 | } 30 | } 31 | --------------------------------------------------------------------------------