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

Remove getTokensOwnedBy #57

Merged
merged 1 commit into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,7 @@ internal class ENS: CommonNamingService, NamingService {
// TODO: Add some batch request and collect all keys by few request
throw ResolutionError.recordNotSupported
}

func tokensOwnedBy(address: String) throws -> [String] {
throw ResolutionError.methodNotSupported
}


func getTokenUri(tokenId: String) throws -> String {
throw ResolutionError.methodNotSupported
}
Expand Down
75 changes: 0 additions & 75 deletions Sources/UnstoppableDomainsResolution/NamingServices/UNS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -139,81 +139,6 @@ internal class UNS: CommonNamingService, NamingService {
}
}

private func parseContractForNewUri(
contract: Contract,
for address: String,
since origin: String
) throws -> [String] {
do {
let transferLogs = try contract.callLogs(
fromBlock: origin,
signatureHash: Self.TransferEventSignature,
for: address.normalized32,
isTransfer: true
).compactMap { $0.topics[3] }

let domainsData = try transferLogs.compactMap {
try contract.callLogs(
fromBlock: origin,
signatureHash: Self.NewURIEventSignature,
for: $0.normalized32,
isTransfer: false
)[0].data
}

let possibleDomains = Array(Set(
domainsData.compactMap {
ABIDecoder.decodeSingleType(type: .string, data: Data(hex: $0)).value as? String
}
)
)
return possibleDomains
} catch {
return []
}
}

func tokensOwnedBy(address: String) throws -> [String] {
let asyncGroup = DispatchGroup()
var possibleDomains: [String] = []

self.nsRegistries.forEach { registry in
asyncGroup.enter()
DispatchQueue.global().async { [weak self] in
guard let self = self else { return }
do {
let domainsFromLogs = try self.parseContractForNewUri(
contract: registry.contract,
for: address,
since: registry.deploymentBlock
)
possibleDomains += domainsFromLogs
asyncGroup.leave()
} catch {
asyncGroup.leave()
}
}
}

var domains: [String] = []
let semaphore = DispatchSemaphore(value: 0)
asyncGroup.notify(queue: .global()) { [weak self] in
guard let self = self else { return }
do {
let owners = try self.batchOwners(domains: possibleDomains)
for (ind, addr) in owners.enumerated() where addr?.lowercased() == address.lowercased() {
domains.append(possibleDomains[ind])
}
semaphore.signal()
} catch {
domains = []
semaphore.signal()
}
}
semaphore.wait()
return domains
}

func resolver(domain: String) throws -> String {
let tokenId = super.namehash(domain: domain)
return try self.resolver(tokenId: tokenId)
Expand Down
4 changes: 0 additions & 4 deletions Sources/UnstoppableDomainsResolution/NamingServices/ZNS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@ internal class ZNS: CommonNamingService, NamingService {
throw ResolutionError.methodNotSupported
}

func tokensOwnedBy(address: String) throws -> [String] {
throw ResolutionError.methodNotSupported
}

func addr(domain: String, ticker: String) throws -> String {
let key = "crypto.\(ticker.uppercased()).address"
let result = try record(domain: domain, key: key)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ protocol NamingService {
func isSupported(domain: String) -> Bool

func owner(domain: String) throws -> String
func tokensOwnedBy(address: String) throws -> [String]
func addr(domain: String, ticker: String) throws -> String
func resolver(domain: String) throws -> String

Expand Down
20 changes: 0 additions & 20 deletions Sources/UnstoppableDomainsResolution/Resolution.swift
Original file line number Diff line number Diff line change
Expand Up @@ -155,26 +155,6 @@ public class Resolution {
}
}

/// Returns domains owned by `address`
/// - Parameter address: - address of a user you want to get domains of
/// - Parameter service: - name of the service you want to check agains CNS or ZNS
/// - Parameter completion: - A callback taht resolves `Result` with an `array of domain names` or `Error`
public func tokensOwnedBy(address: String, service: String, completion: @escaping StringsArrayResultConsumer ) {
DispatchQueue.global(qos: .utility).async { [weak self] in
do {

guard let serviceName = NamingServiceName(rawValue: service),
let namingService = self?.services.first(where: { $0.name == serviceName }) else {
throw ResolutionError.unsupportedServiceName
}
let result = try namingService.tokensOwnedBy(address: address)
completion(.success(result))
} catch {
self?.catchError(error, completion: completion)
}
}
}

/// Resolves a resolver address of a `domain`
/// - Parameter domain: - domain name to be resolved
/// - Parameter completion: A callback that resolves `Result` with a `resolver address` for a specific domain or `Error`
Expand Down
70 changes: 1 addition & 69 deletions Tests/ResolutionTests/ResolutionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ class ResolutionTests: XCTestCase {

// Then
assert(owner.lowercased() == "0xe7474D07fD2FA286e7e0aa23cd107F8379085037".lowercased())
assert(ethOwner.lowercased() == "0x714ef33943d925731fbb89c99af5780d888bd106".lowercased())
assert(ethOwner.lowercased() == "0xa59C818Ddb801f1253edEbf0Cf08c9E481EA2fE5".lowercased())
self.checkError(result: unregisteredResult, expectedError: ResolutionError.unregisteredDomain)
}

Expand Down Expand Up @@ -632,74 +632,6 @@ class ResolutionTests: XCTestCase {
assert(chatID == "0x8912623832e174f2eb1f59cc3b587444d619376ad5bf10070e937e0dc22b9ffb2e3ae059e6ebf729f87746b2f71e5d88ec99c1fb3c7c49b8617e2520d474c48e1c")
}

func testForTokensOwnedByUns() throws {
let tokenReceived = expectation(description: "tokens for 0xac54c586798912c9a6d4a26d3e9fe19f384256de address should be received");
var returnedDomains: [String] = [];

resolution.tokensOwnedBy(address: "0xac54c586798912c9a6d4a26d3e9fe19f384256de", service: "uns") { result in
switch result {
case .success(let domains):
returnedDomains = domains.compactMap{ $0 };
tokenReceived.fulfill()
case .failure(let error):
XCTFail("Expected domains, but got \(error)")
}
}
waitForExpectations(timeout: timeout, handler: nil)
assert(returnedDomains.count >= 3);
assert(returnedDomains.contains("amazing.crypto"));
assert(returnedDomains.contains("july23.bitcoin"));
assert(returnedDomains.contains("roman.bitcoin"));

}

func testForTokensOwnedByCns() throws {
let tokenReceived = expectation(description: "tokens for 0x8aaD44321A86b170879d7A244c1e8d360c99DdA8 address should be received");
var returnedDomains: [String] = [];
resolution.tokensOwnedBy(address: "0xe7474D07fD2FA286e7e0aa23cd107F8379085037", service: "uns") { (result) in
switch result {
case .success(let returnValue):
returnedDomains = returnValue.compactMap{ $0 }
tokenReceived.fulfill()
case .failure(let error):
XCTFail("something went wrong \(error)")
}

}
waitForExpectations(timeout: timeout, handler: nil)
assert(returnedDomains.count >= 3)
assert(returnedDomains.contains("johnnytestdev6357.crypto"))
assert(returnedDomains.contains("johnnydevtest6357.crypto"))
assert(returnedDomains.contains("udtestdev-265f8f.crypto"))
}

func testForTokensOwnedByCnsFromRinkeby() throws {
let tetReceived = expectation(description: "This is just for test");
let resolutionB = try Resolution(configs: Configurations(
uns: NamingServiceConfig(
providerUrl: "https://rinkeby.infura.io/v3/e05c36b6b2134ccc9f2594ddff94c136",
network: "rinkeby"
)))
var returnedDomains: [String] = [];
resolutionB.tokensOwnedBy(address: "0x6EC0DEeD30605Bcd19342f3c30201DB263291589", service: "uns") { (result) in
switch result {
case .success(let returnValue):
returnedDomains = returnValue.compactMap{ $0 }
tetReceived.fulfill()
case .failure(let error):
XCTFail("something went wrong \(error)")
}

}
waitForExpectations(timeout: timeout, handler: nil)
assert(returnedDomains.count == 5)
assert(returnedDomains.contains("udtestdev-creek.crypto"))
assert(returnedDomains.contains("udtestdev-my-new-tls.wallet"))
assert(returnedDomains.contains("reseller-test-udtesting-630444001358.crypto"))
assert(returnedDomains.contains("test-test-test-test.crypto"))
assert(returnedDomains.contains("reseller-test-udtesting-483809515990.crypto"))
}

func testIpfs() throws {
// Given
let domainReceived = expectation(description: "Exist domain should be received")
Expand Down