Skip to content

Commit 5e15865

Browse files
Add ContractProtocol comment
- slightly refactor of ERC20 protocol (only style, to make it's logic more clear).
1 parent f9e7c35 commit 5e15865

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

Sources/web3swift/Contract/ContractProtocol.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ extension ContractProtocol {
216216
/// Contains default implementations of all functions of ``ContractProtocol``.
217217
public protocol DefaultContractProtocol: ContractProtocol {}
218218
extension DefaultContractProtocol {
219+
// MARK: Writing Data flow
219220
public func deploy(bytecode: Data,
220221
constructor: ABI.Element.Constructor?,
221222
parameters: [AnyObject]?,
@@ -238,32 +239,51 @@ extension DefaultContractProtocol {
238239
fullData.append(extraData)
239240
}
240241

242+
// MARK: Writing Data flow
241243
return EthereumTransaction(to: .contractDeploymentAddress(),
242244
value: BigUInt(0),
243245
data: fullData,
244246
parameters: .init(gasLimit: BigUInt(0), gasPrice: BigUInt(0)))
245247
}
246248

249+
/// Call given contract method with given parameters
250+
/// - Parameters:
251+
/// - method: Method to call
252+
/// - parameters: Parameters to pass to method call
253+
/// - extraData: Any additional data that needs to be encoded
254+
/// - Returns: preset EthereumTransaction with filled date
255+
///
256+
/// Returned transaction have filled following priperties:
257+
/// - to: contractAddress
258+
/// - value: 0
259+
/// - data: parameters + extraData
260+
/// - params: EthereumParameters with no contract method call encoded data.
247261
public func method(_ method: String,
248262
parameters: [AnyObject],
249263
extraData: Data?) -> EthereumTransaction? {
250264
guard let to = self.address else { return nil }
251265

252266
let params = EthereumParameters(gasLimit: BigUInt(0), gasPrice: BigUInt(0))
253267

268+
// MARK: - Encoding ABI Data flow
254269
if method == "fallback" {
255270
return EthereumTransaction(to: to, value: BigUInt(0), data: extraData ?? Data(), parameters: params)
256271
}
257272

258273
let method = Data.fromHex(method) == nil ? method : method.addHexPrefix().lowercased()
259274

275+
// MARK: - Encoding ABI Data flow
260276
guard let abiMethod = methods[method]?.first,
261277
var encodedData = abiMethod.encodeParameters(parameters) else { return nil }
262278

279+
// Extra data just appends in the end of parameters data
263280
if let extraData = extraData {
264281
encodedData.append(extraData)
265282
}
266283

284+
// MARK: - Encoding ABI Data flow
285+
// return filled EthereumTransaction, which is could be sent iterate with a contract.
286+
// But no gas related data here yet.
267287
return EthereumTransaction(to: to, value: BigUInt(0), data: encodedData, parameters: params)
268288
}
269289

Sources/web3swift/Tokens/ERC20/Web3+ERC20.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
5353
let contract = self.contract
5454
var transactionOptions = TransactionOptions()
5555
transactionOptions.callOnBlock = .latest
56-
let result = try await contract.read("balanceOf", parameters: [account] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
56+
let result = try await contract
57+
.read("balanceOf", parameters: [account] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!
58+
.call(transactionOptions: transactionOptions)
5759
guard let res = result["0"] as? BigUInt else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
5860
return res
5961
}
@@ -62,7 +64,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
6264
let contract = self.contract
6365
var transactionOptions = TransactionOptions()
6466
transactionOptions.callOnBlock = .latest
65-
let result = try await contract.read("allowance", parameters: [originalOwner, delegate] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
67+
let result = try await contract
68+
.read("allowance", parameters: [originalOwner, delegate] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!
69+
.call(transactionOptions: transactionOptions)
6670
guard let res = result["0"] as? BigUInt else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
6771
return res
6872
}
@@ -75,7 +79,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
7579
basicOptions.callOnBlock = .latest
7680

7781
// get the decimals manually
78-
let callResult = try await contract.read("decimals", transactionOptions: basicOptions)!.call()
82+
let callResult = try await contract
83+
.read("decimals", transactionOptions: basicOptions)!
84+
.call()
7985
var decimals = BigUInt(0)
8086
guard let dec = callResult["0"], let decTyped = dec as? BigUInt else {
8187
throw Web3Error.inputError(desc: "Contract may be not ERC20 compatible, can not get decimals")}
@@ -97,7 +103,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
97103
basicOptions.callOnBlock = .latest
98104

99105
// get the decimals manually
100-
let callResult = try await contract.read("decimals", transactionOptions: basicOptions)!.call()
106+
let callResult = try await contract
107+
.read("decimals", transactionOptions: basicOptions)!
108+
.call()
101109
var decimals = BigUInt(0)
102110
guard let dec = callResult["0"], let decTyped = dec as? BigUInt else {
103111
throw Web3Error.inputError(desc: "Contract may be not ERC20 compatible, can not get decimals")}
@@ -120,7 +128,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
120128
basicOptions.callOnBlock = .latest
121129

122130
// get the decimals manually
123-
let callResult = try await contract.read("decimals", transactionOptions: basicOptions)!.call()
131+
let callResult = try await contract
132+
.read("decimals", transactionOptions: basicOptions)!
133+
.call()
124134
var decimals = BigUInt(0)
125135
guard let dec = callResult["0"], let decTyped = dec as? BigUInt else {
126136
throw Web3Error.inputError(desc: "Contract may be not ERC20 compatible, can not get decimals")}
@@ -143,7 +153,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
143153
basicOptions.callOnBlock = .latest
144154

145155
// get the decimals manually
146-
let callResult = try await contract.read("decimals", transactionOptions: basicOptions)!.call()
156+
let callResult = try await contract
157+
.read("decimals", transactionOptions: basicOptions)!
158+
.call()
147159
var decimals = BigUInt(0)
148160
guard let dec = callResult["0"], let decTyped = dec as? BigUInt else {
149161
throw Web3Error.inputError(desc: "Contract may be not ERC20 compatible, can not get decimals")}
@@ -162,7 +174,9 @@ public class ERC20: IERC20, ERC20BaseProperties {
162174
let contract = self.contract
163175
var transactionOptions = TransactionOptions()
164176
transactionOptions.callOnBlock = .latest
165-
let result = try await contract.read("totalSupply", parameters: [AnyObject](), extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
177+
let result = try await contract
178+
.read("totalSupply", parameters: [AnyObject](), extraData: Data(), transactionOptions: self.transactionOptions)!
179+
.call(transactionOptions: transactionOptions)
166180
guard let res = result["0"] as? BigUInt else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
167181
return res
168182
}

0 commit comments

Comments
 (0)