├── .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 |
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 |
--------------------------------------------------------------------------------