Skip to content

Commit

Permalink
feat: add masa resolver (#178)
Browse files Browse the repository at this point in the history
  • Loading branch information
H34D committed Apr 17, 2023
1 parent ef0c570 commit 5b4608f
Show file tree
Hide file tree
Showing 7 changed files with 267 additions and 8 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"@celo/identity": "^4.0.0",
"@celo/utils": "^4.0.0",
"@ensdomains/ensjs": "^2.1.0",
"@masa-finance/masa-sdk": "^1.12.1",
"eth-ens-namehash": "^2.0.8",
"ethers": "^5.7.2"
},
Expand Down
13 changes: 11 additions & 2 deletions scripts/resolve.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
/* eslint no-console: "off" */
import yargs from 'yargs'

import { ResolveGroup, ResolveAddress, ResolveNom } from '../src'
import { ResolveSocialConnect } from '../src'
import {
ResolveAddress,
ResolveGroup,
ResolveMasa,
ResolveNom,
ResolveSocialConnect,
} from '../src'

import { OdisUtils } from '@celo/identity'
import { OdisContextName } from '@celo/identity/lib/odis/query'
Expand Down Expand Up @@ -38,6 +43,10 @@ async function main(args: ReturnType<typeof parseArgs>) {
providerUrl,
ensRegistryAddress: network.ensRegistryAddress,
}),
new ResolveMasa({
providerUrl,
networkName: args['network-id'],
}),
]

if (args['private-key']) {
Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ export { ResolveAddress } from './resolve-address'
export { ResolveGroup } from './resolve-group'
export { ResolveNom } from './resolve-nom'
export { ResolveSocialConnect } from './resolve-social-connect'
export { ResolveMasa } from './resolve-masa'
78 changes: 78 additions & 0 deletions src/resolve-masa.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { ResolveMasa } from './resolve-masa'
import { Masa } from '@masa-finance/masa-sdk'
import { providers } from 'ethers'

jest.mock('@masa-finance/masa-sdk')

describe('masa', () => {
describe('ResolveMasa', () => {
const MasaMock: any = jest.mocked(Masa)

MasaMock.mockImplementation(() => ({
soulName: {
resolve: (soulName: string): Promise<string> =>
new Promise((resolve) => {
switch (soulName) {
case '_test_':
return resolve('')
case 'test':
return resolve('0x8ba2D360323e3cA85b94c6F7720B70aAc8D37a7a')
case 't89e3786oaruhmazj7r453iwqb6g7uac':
return resolve('')
}
}),
},
contracts: {
instances: {
SoulNameContract: {
extension: (): Promise<string> =>
new Promise((resolve) => resolve('.celo')),
},
},
},
}))

const masa = new Masa({
wallet: new providers.JsonRpcProvider().getSigner(),
networkName: 'alfajores',
})

const resolver = new ResolveMasa({ masa })

it('should return an address for a valid name', async () => {
const resolutions = await resolver.resolve('test.celo')

expect(resolutions.resolutions.length).toBe(1)
expect(resolutions.errors.length).toBe(0)

const resolution = resolutions.resolutions[0]
expect(resolution.address).toBe(
'0x8ba2D360323e3cA85b94c6F7720B70aAc8D37a7a',
)
expect(resolution.name).toBe('test')
})

it('should return nothing for a name with invalid ending', async () => {
const resolutions = await resolver.resolve('test.cole')

expect(resolutions.resolutions.length).toBe(0)
expect(resolutions.errors.length).toBe(0)
})

it('should return nothing for an invalid name', async () => {
const resolutions = await resolver.resolve('_test_.celo')

expect(resolutions.resolutions.length).toBe(0)
expect(resolutions.errors.length).toBe(0)
})

it('should return nothing for unknown name', async () => {
const resolutions = await resolver.resolve(
't89e3786oaruhmazj7r453iwqb6g7uac.celo',
)

expect(resolutions.resolutions.length).toBe(0)
expect(resolutions.errors.length).toBe(0)
})
})
})
59 changes: 59 additions & 0 deletions src/resolve-masa.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { NameResolutionResults, NameResolver, ResolutionKind } from './types'

import { providers } from 'ethers'
import { Masa } from '@masa-finance/masa-sdk'

export class ResolveMasa implements NameResolver {
masa: Masa

constructor({
providerUrl,
networkName,
masa,
}: {
providerUrl?: string
networkName?: string
masa?: Masa
}) {
this.masa = masa
? masa
: new Masa({
wallet: new providers.JsonRpcProvider(providerUrl).getSigner(),
networkName: networkName === 'mainnet' ? 'celo' : 'alfajores',
})
}

async resolve(id: string): Promise<NameResolutionResults> {
const result: NameResolutionResults = {
resolutions: [],
errors: [],
}

try {
const extension =
await this.masa.contracts.instances.SoulNameContract.extension()

if (!id.endsWith(extension)) {
return result
}

const name = id.replace(extension, '')

const address = await this.masa.soulName.resolve(name)
if (address) {
result.resolutions.push({
kind: ResolutionKind.Masa,
address,
name,
})
}
} catch (error) {
result.errors.push({
kind: ResolutionKind.Masa,
error: error as Error,
})
}

return result
}
}
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export enum ResolutionKind {
Address = 'address',
Nom = 'nom',
SocialConnect = 'social-connect',
Masa = 'masa',
}

export interface NameResolution {
Expand Down
Loading

0 comments on commit 5b4608f

Please sign in to comment.