-
Notifications
You must be signed in to change notification settings - Fork 455
/
Copy pathENS.swift
155 lines (134 loc) · 5.98 KB
/
ENS.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//
// ENS.swift
// web3swift-iOS
//
import Foundation
import BigInt
import Result
public struct ENS {
let web3: web3
let ensContractAddress: EthereumAddress?
init(web3: web3) {
self.web3 = web3
switch web3.provider.network {
case .Mainnet?:
ensContractAddress = EthereumAddress("0x314159265dd8dbb310642f98f50c066173c1259b")
case .Rinkeby?:
ensContractAddress = EthereumAddress("0xe7410170f87102df0055eb195163a03b7f2bff4a")
case .Ropsten?:
ensContractAddress = EthereumAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010")
default:
ensContractAddress = nil
}
}
private lazy var registryContract: web3.web3contract = {
let contract = self.web3.contract(Web3.Utils.ensRegistryABI, at: self.ensContractAddress, abiVersion: 2)
precondition(contract != nil)
return contract!
}()
//MARK: - Returns resolver for the given domain
mutating func resolver(forDomain domain: String) -> Result<ResolverENS, Web3Error> {
guard let nameHash = NameHash.nameHash(domain) else { return Result.failure(Web3Error.dataError) }
let options = Web3Options.defaultOptions()
guard let transaction = self.registryContract.method("resolver", parameters: [nameHash as AnyObject], options: options) else { return Result.failure(Web3Error.transactionSerializationError) }
let result = transaction.call(options: options)
switch result {
case .success(let res):
guard let resolverAddress = res["0"] as? EthereumAddress else { return Result.failure(Web3Error.dataError) }
return Result(ResolverENS(web3: self.web3, resolverAddress: resolverAddress))
case .failure(let error):
return Result.failure(error)
}
}
//TODO: -
/*
1. Write a function that allows map domain to the name
*/
}
public struct ResolverENS {
let web3: web3
let resolverAddress: EthereumAddress
public enum InterfaceName {
case addr
case name
case ABI
case pubkey
func hash() -> String {
switch self {
case .ABI:
return "0x2203ab56"
case .addr:
return "0x3b3b57de"
case .name:
return "0x691f3431"
case .pubkey:
return "0xc8690233"
}
}
}
private lazy var resolverContract: web3.web3contract = {
let contract = self.web3.contract(Web3.Utils.resolverABI, at: self.resolverAddress, abiVersion: 2)
precondition(contract != nil)
return contract!
}()
init(web3: web3, resolverAddress: EthereumAddress) {
self.web3 = web3
self.resolverAddress = resolverAddress
}
mutating func supportsInterface(interfaceID: Data) -> Result<Bool, Web3Error> {
return supportsInterface(interfaceID: interfaceID.toHexString())
}
//MARK: - returns true if the contract supports given interface
mutating func supportsInterface(interfaceID: String) -> Result<Bool, Web3Error> {
let options = Web3Options.defaultOptions()
guard let transaction = self.resolverContract.method("supportsInterface", parameters: [interfaceID as AnyObject], options: options) else { return Result.failure(Web3Error.transactionSerializationError) }
let result = transaction.call(options: options)
switch result {
case .success(let res):
guard let supports = res["0"] as? Bool else { return Result.failure(Web3Error.dataError) }
return Result(supports)
case .failure(let error):
return Result.failure(error)
}
}
//MARK: - returns address for the given domain at given resolver
mutating func addr(forDomain domain: String) -> Result<EthereumAddress, Web3Error> {
guard let nameHash = NameHash.nameHash(domain) else { return Result.failure(Web3Error.dataError) }
let options = Web3Options.defaultOptions()
guard let transaction = self.resolverContract.method("addr", parameters: [nameHash as AnyObject], options: options) else { return Result.failure(Web3Error.dataError) }
let result = transaction.call(options: options)
switch result {
case .success(let res):
return Result(res["0"] as! EthereumAddress)
case .failure(let error):
return Result.failure(error)
}
}
//MARK: - returns corresponding ENS to the requested node
mutating func name(node: String) -> Result<String, Web3Error> {
let options = Web3Options.defaultOptions()
guard let transaction = self.resolverContract.method("name", parameters: [node.lowercased() as AnyObject], options: options) else { return Result.failure(Web3Error.transactionSerializationError)}
let result = transaction.call(options: options)
switch result {
case .success(let res):
return Result(res["0"] as! String)
case .failure(let error):
return Result.failure(error)
}
}
//MARK: - returns ABI in the requested encodings
mutating func ABI(node: String, contentType: BigUInt) -> Result<(BigUInt, Data), Web3Error> {
let options = Web3Options.defaultOptions()
guard let transaction = self.resolverContract.method("ABI", parameters: [node, contentType] as [AnyObject], options: options) else { return Result.failure(Web3Error.transactionSerializationError) }
let result = transaction.call(options: options)
switch result {
case .success(let res):
guard let encoding = res["0"] as? BigUInt else { return Result.failure(Web3Error.dataError) }
guard let data = res["1"] as? Data else { return Result.failure(Web3Error.dataError) }
return Result((encoding, data))
case .failure(let error):
return Result.failure(error)
}
}
//TODO: - func pubkey()
}