Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: endpoint and noop world name validators #60

Draft
wants to merge 20 commits into
base: main
Choose a base branch
from
22 changes: 17 additions & 5 deletions .env.default
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ HTTP_SERVER_PORT=3000
HTTP_SERVER_HOST=0.0.0.0
#HTTP_BASE_URL=https://worlds-content-server.decentraland.org

RPC_URL=https://rpc.decentraland.org/mainnet?project=worlds-content-server
MARKETPLACE_SUBGRAPH_URL=https://api.thegraph.com/subgraphs/name/decentraland/marketplace

SNS_ARN=

LAMBDAS_URL=https://peer.decentraland.org/lambdas
Expand All @@ -38,11 +35,26 @@ COMMS_FIXED_ADAPTER=ws-room:ws-room-service.decentraland.org/rooms/test-scene
#LIVEKIT_API_KEY=
#LIVEKIT_API_SECRET=

#############################
## Name permission checker ##
#############################
NAME_VALIDATOR=THE_GRAPH_DCL_NAME_CHECKER
MARKETPLACE_SUBGRAPH_URL=https://api.thegraph.com/subgraphs/name/decentraland/marketplace

#NAME_VALIDATOR=ON_CHAIN_DCL_NAME_CHECKER
RPC_URL=https://rpc.decentraland.org/mainnet?project=worlds-content-server

#NAME_VALIDATOR=ENDPOINT_NAME_CHECKER #(checks permissions against a a custom endpoint)
#ENDPOINT_NAME_CHECKER_BASE_URL=https://my-custom-name-checker.com/checker
#NAME_VALIDATOR=NOOP_NAME_CHECKER #(allows deployment to any valid world name by any valid ETH address)

##########################
## Miscelaneous configs ##
##########################

# number of ms that the deployment has to be newer than
DEPLOYMENT_TTL=300000
MAX_PARCELS=4
MAX_SIZE=100
ALLOW_SDK6=false
WHITELIST_URL=https://config.decentraland.org/worlds-whitelist.json
NAME_VALIDATOR=DCL_NAME_CHECKER
#NAME_VALIDATOR=ON_CHAIN_DCL_NAME_CHECKER (no need for thegraph but needs an ethereum node)
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,34 @@ type NamesResponse = {
nfts: { name: string; owner: { id: string } }[]
}

export const createDclNameChecker = (
export async function createWorldNamePermissionChecker(
components: Pick<AppComponents, 'config' | 'ethereumProvider' | 'fetch' | 'logs' | 'marketplaceSubGraph'>
): Promise<IWorldNamePermissionChecker> {
const logger = components.logs.getLogger('check-permissions')
const nameValidatorStrategy = await components.config.requireString('NAME_VALIDATOR')
switch (nameValidatorStrategy) {
case 'THE_GRAPH_DCL_NAME_CHECKER':
logger.info('Using TheGraph DclNameChecker')
return createTheGraphDclNameChecker(components)
case 'ON_CHAIN_DCL_NAME_CHECKER':
logger.info('Using OnChain DclNameChecker')
return await createOnChainDclNameChecker(components)
marianogoldman marked this conversation as resolved.
Show resolved Hide resolved
case 'ENDPOINT_NAME_CHECKER':
logger.info('Using Endpoint NameChecker')
return await createEndpointNameChecker(components)
case 'NOOP_NAME_CHECKER':
logger.info('Using NoOp NameChecker')
return await createNoOpNameChecker()

// Add more name validator strategies as needed here
}
throw Error(`Invalid nameValidatorStrategy selected: ${nameValidatorStrategy}`)
}

export async function createTheGraphDclNameChecker(
components: Pick<AppComponents, 'logs' | 'marketplaceSubGraph'>
): IWorldNamePermissionChecker => {
): Promise<IWorldNamePermissionChecker> {
const logger = components.logs.getLogger('check-permissions')
logger.info('Using TheGraph DclNameChecker')

const cache = new LRU<string, string | undefined>({
max: 100,
Expand Down Expand Up @@ -66,11 +89,10 @@ export const createDclNameChecker = (
}
}

export const createOnChainDclNameChecker = async (
export async function createOnChainDclNameChecker(
components: Pick<AppComponents, 'config' | 'logs' | 'ethereumProvider'>
): Promise<IWorldNamePermissionChecker> => {
): Promise<IWorldNamePermissionChecker> {
const logger = components.logs.getLogger('check-permissions')
logger.info('Using OnChain DclNameChecker')
const networkId = await components.config.requireString('NETWORK_ID')
const networkName = networkId === '1' ? 'mainnet' : 'goerli'
const factory = new ContractFactory(new RequestManager(components.ethereumProvider), checkerAbi)
Expand All @@ -97,3 +119,35 @@ export const createOnChainDclNameChecker = async (
checkPermission
}
}

export async function createEndpointNameChecker(
components: Pick<AppComponents, 'config' | 'logs' | 'fetch'>
): Promise<IWorldNamePermissionChecker> {
const nameCheckUrl = await components.config.requireString('ENDPOINT_NAME_CHECKER_BASE_URL')

return {
checkPermission: async (ethAddress: EthAddress, worldName: string): Promise<boolean> => {
if (worldName.length === 0 || ethAddress.length === 0) {
return false
}

const res = await components.fetch.fetch(nameCheckUrl, {
method: 'POST',
body: JSON.stringify({
worldName: worldName,
ethAddress: ethAddress
})
})

return res.json()
}
}
}

export async function createNoOpNameChecker(): Promise<IWorldNamePermissionChecker> {
return {
checkPermission: async (ethAddress: EthAddress, worldName: string): Promise<boolean> => {
return !(worldName.length === 0 || ethAddress.length === 0)
}
}
}
28 changes: 8 additions & 20 deletions src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ import { createServerComponent, createStatusCheckComponent } from '@well-known-c
import { createLogComponent } from '@well-known-components/logger'
import { createFetchComponent } from './adapters/fetch'
import { createMetricsComponent } from '@well-known-components/metrics'
import { createSubgraphComponent } from '@well-known-components/thegraph-component'
import { AppComponents, GlobalContext, ICommsAdapter, IWorldNamePermissionChecker, SnsComponent } from './types'
import {
createSubgraphComponent,
metricDeclarations as theGraphMetricDeclarations
} from '@well-known-components/thegraph-component'
import { AppComponents, GlobalContext, ICommsAdapter, SnsComponent } from './types'
import { metricDeclarations } from './metrics'
import { metricDeclarations as theGraphMetricDeclarations } from '@well-known-components/thegraph-component'
import { HTTPProvider } from 'eth-connect'
import {
createAwsS3BasedFileSystemContentStorage,
Expand All @@ -15,26 +17,11 @@ import {
} from '@dcl/catalyst-storage'
import { createStatusComponent } from './adapters/status'
import { createValidator } from './adapters/validator'
import { createDclNameChecker, createOnChainDclNameChecker } from './adapters/dcl-name-checker'
import { createWorldNamePermissionChecker } from './adapters/world-name-permission-checker'
import { createLimitsManagerComponent } from './adapters/limits-manager'
import { createWorldsManagerComponent } from './adapters/worlds-manager'
import { createCommsAdapterComponent } from './adapters/comms-adapter'

async function determineNameValidator(
components: Pick<AppComponents, 'config' | 'ethereumProvider' | 'logs' | 'marketplaceSubGraph'>
) {
const nameValidatorStrategy = await components.config.requireString('NAME_VALIDATOR')
switch (nameValidatorStrategy) {
case 'DCL_NAME_CHECKER':
return createDclNameChecker(components)
case 'ON_CHAIN_DCL_NAME_CHECKER':
return await createOnChainDclNameChecker(components)

// Add more name validator strategies as needed here
}
throw Error(`Invalid nameValidatorStrategy selected: ${nameValidatorStrategy}`)
}

// Initialize all the components of the app
export async function initComponents(): Promise<AppComponents> {
const config = await createDotEnvConfigComponent({ path: ['.env.default', '.env'] })
Expand Down Expand Up @@ -79,9 +66,10 @@ export async function initComponents(): Promise<AppComponents> {
arn: snsArn
}

const namePermissionChecker: IWorldNamePermissionChecker = await determineNameValidator({
const namePermissionChecker = await createWorldNamePermissionChecker({
config,
ethereumProvider,
fetch,
logs,
marketplaceSubGraph
})
Expand Down
120 changes: 0 additions & 120 deletions test/unit/dcl-name-checker.spec.ts

This file was deleted.

Loading