Skip to content

Commit a5b7f84

Browse files
committed
feat(Client): more api features
Signed-off-by: Ricky Saechao <ricky@launchbadge.com>
1 parent f105126 commit a5b7f84

File tree

4 files changed

+284
-0
lines changed

4 files changed

+284
-0
lines changed

.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>SchemeUserState</key>
6+
<dict>
7+
<key>AccountAliasExample.xcscheme_^#shared#^_</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>2</integer>
11+
</dict>
12+
<key>AccountAllowanceExample.xcscheme_^#shared#^_</key>
13+
<dict>
14+
<key>orderHint</key>
15+
<integer>3</integer>
16+
</dict>
17+
<key>ConsensusPubSubChunkedExample.xcscheme_^#shared#^_</key>
18+
<dict>
19+
<key>orderHint</key>
20+
<integer>4</integer>
21+
</dict>
22+
<key>ConsensusPubSubExample.xcscheme_^#shared#^_</key>
23+
<dict>
24+
<key>orderHint</key>
25+
<integer>5</integer>
26+
</dict>
27+
<key>ConsensusPubSubWithSubmitKeyExample.xcscheme_^#shared#^_</key>
28+
<dict>
29+
<key>orderHint</key>
30+
<integer>6</integer>
31+
</dict>
32+
<key>CreateAccountExample.xcscheme_^#shared#^_</key>
33+
<dict>
34+
<key>orderHint</key>
35+
<integer>7</integer>
36+
</dict>
37+
<key>CreateAccountThresholdKeyExample.xcscheme_^#shared#^_</key>
38+
<dict>
39+
<key>orderHint</key>
40+
<integer>8</integer>
41+
</dict>
42+
<key>CreateFileExample.xcscheme_^#shared#^_</key>
43+
<dict>
44+
<key>orderHint</key>
45+
<integer>9</integer>
46+
</dict>
47+
<key>CreateSimpleContractExample.xcscheme_^#shared#^_</key>
48+
<dict>
49+
<key>orderHint</key>
50+
<integer>10</integer>
51+
</dict>
52+
<key>CreateStatefulContractExample.xcscheme_^#shared#^_</key>
53+
<dict>
54+
<key>orderHint</key>
55+
<integer>11</integer>
56+
</dict>
57+
<key>CreateTopicExample.xcscheme_^#shared#^_</key>
58+
<dict>
59+
<key>orderHint</key>
60+
<integer>12</integer>
61+
</dict>
62+
<key>DeleteAccountExample.xcscheme_^#shared#^_</key>
63+
<dict>
64+
<key>orderHint</key>
65+
<integer>13</integer>
66+
</dict>
67+
<key>DeleteFileExample.xcscheme_^#shared#^_</key>
68+
<dict>
69+
<key>orderHint</key>
70+
<integer>14</integer>
71+
</dict>
72+
<key>FileAppendChunkedExample.xcscheme_^#shared#^_</key>
73+
<dict>
74+
<key>orderHint</key>
75+
<integer>15</integer>
76+
</dict>
77+
<key>GenerateKeyExample.xcscheme_^#shared#^_</key>
78+
<dict>
79+
<key>orderHint</key>
80+
<integer>16</integer>
81+
</dict>
82+
<key>GenerateKeyWithMnemonicExample.xcscheme_^#shared#^_</key>
83+
<dict>
84+
<key>orderHint</key>
85+
<integer>17</integer>
86+
</dict>
87+
<key>GetAccountBalanceExample.xcscheme_^#shared#^_</key>
88+
<dict>
89+
<key>orderHint</key>
90+
<integer>18</integer>
91+
</dict>
92+
<key>GetAccountInfoExample.xcscheme_^#shared#^_</key>
93+
<dict>
94+
<key>orderHint</key>
95+
<integer>19</integer>
96+
</dict>
97+
<key>GetAddressBookExample.xcscheme_^#shared#^_</key>
98+
<dict>
99+
<key>orderHint</key>
100+
<integer>20</integer>
101+
</dict>
102+
<key>GetExchangeRatesExample.xcscheme_^#shared#^_</key>
103+
<dict>
104+
<key>orderHint</key>
105+
<integer>21</integer>
106+
</dict>
107+
<key>GetFileContentsExample.xcscheme_^#shared#^_</key>
108+
<dict>
109+
<key>orderHint</key>
110+
<integer>22</integer>
111+
</dict>
112+
<key>Hedera-Package.xcscheme_^#shared#^_</key>
113+
<dict>
114+
<key>orderHint</key>
115+
<integer>0</integer>
116+
</dict>
117+
<key>Hedera.xcscheme_^#shared#^_</key>
118+
<dict>
119+
<key>orderHint</key>
120+
<integer>1</integer>
121+
</dict>
122+
<key>MultiAppTransferExample.xcscheme_^#shared#^_</key>
123+
<dict>
124+
<key>orderHint</key>
125+
<integer>23</integer>
126+
</dict>
127+
<key>MultiSigOfflineExample.xcscheme_^#shared#^_</key>
128+
<dict>
129+
<key>orderHint</key>
130+
<integer>24</integer>
131+
</dict>
132+
<key>PrngExample.xcscheme_^#shared#^_</key>
133+
<dict>
134+
<key>orderHint</key>
135+
<integer>25</integer>
136+
</dict>
137+
<key>ScheduleExample.xcscheme_^#shared#^_</key>
138+
<dict>
139+
<key>orderHint</key>
140+
<integer>26</integer>
141+
</dict>
142+
<key>ScheduleIdenticalTransactionExample.xcscheme_^#shared#^_</key>
143+
<dict>
144+
<key>orderHint</key>
145+
<integer>27</integer>
146+
</dict>
147+
<key>ScheduleMultiSigTransactionExample.xcscheme_^#shared#^_</key>
148+
<dict>
149+
<key>orderHint</key>
150+
<integer>28</integer>
151+
</dict>
152+
<key>ScheduledTransactionMultiSigThresholdExample.xcscheme_^#shared#^_</key>
153+
<dict>
154+
<key>orderHint</key>
155+
<integer>29</integer>
156+
</dict>
157+
<key>ScheduledTransferExample.xcscheme_^#shared#^_</key>
158+
<dict>
159+
<key>orderHint</key>
160+
<integer>30</integer>
161+
</dict>
162+
<key>StakingExample.xcscheme_^#shared#^_</key>
163+
<dict>
164+
<key>orderHint</key>
165+
<integer>31</integer>
166+
</dict>
167+
<key>StakingWithUpdateExample.xcscheme_^#shared#^_</key>
168+
<dict>
169+
<key>orderHint</key>
170+
<integer>32</integer>
171+
</dict>
172+
<key>TopicWithAdminKeyExample.xcscheme_^#shared#^_</key>
173+
<dict>
174+
<key>orderHint</key>
175+
<integer>33</integer>
176+
</dict>
177+
<key>TransferCryptoExample.xcscheme_^#shared#^_</key>
178+
<dict>
179+
<key>orderHint</key>
180+
<integer>34</integer>
181+
</dict>
182+
<key>TransferTokensExample.xcscheme_^#shared#^_</key>
183+
<dict>
184+
<key>orderHint</key>
185+
<integer>35</integer>
186+
</dict>
187+
<key>UpdateAccountPublicKeyExample.xcscheme_^#shared#^_</key>
188+
<dict>
189+
<key>orderHint</key>
190+
<integer>36</integer>
191+
</dict>
192+
<key>ValidateChecksumExample.xcscheme_^#shared#^_</key>
193+
<dict>
194+
<key>orderHint</key>
195+
<integer>37</integer>
196+
</dict>
197+
</dict>
198+
</dict>
199+
</plist>

Sources/Hedera/Client/Client.swift

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public final class Client: Sendable {
3434
private let networkUpdateTask: NetworkUpdateTask
3535
private let regenerateTransactionIdInner: ManagedAtomic<Bool>
3636
private let maxTransactionFeeInner: ManagedAtomic<Int64>
37+
private let maxQueryPaymentInner: ManagedAtomic<Int64>
3738
private let networkUpdatePeriodInner: NIOLockedValueBox<UInt64?>
3839
private let backoffInner: NIOLockedValueBox<Backoff>
3940

@@ -50,6 +51,7 @@ public final class Client: Sendable {
5051
self.autoValidateChecksumsInner = .init(false)
5152
self.regenerateTransactionIdInner = .init(true)
5253
self.maxTransactionFeeInner = .init(0)
54+
self.maxQueryPaymentInner = .init(0)
5355
self.networkUpdateTask = NetworkUpdateTask(
5456
eventLoop: eventLoop,
5557
managedNetwork: network,
@@ -80,6 +82,16 @@ public final class Client: Sendable {
8082
return .fromTinybars(value)
8183
}
8284

85+
internal var maxQueryPayment: Hbar? {
86+
let value = maxQueryPaymentInner.load(ordering: .relaxed)
87+
88+
guard value != 0 else {
89+
return nil
90+
}
91+
92+
return .fromTinybars(value)
93+
}
94+
8395
/// The maximum amount of time that will be spent on a request.
8496
public var requestTimeout: TimeInterval? {
8597
get { backoff.requestTimeout }
@@ -214,6 +226,22 @@ public final class Client: Sendable {
214226
return self
215227
}
216228

229+
/// Sets the account that will, by default, be paying for transactions and queries built with
230+
/// this client.
231+
///
232+
/// The operator account ID is used to generate the default transaction ID for all transactions
233+
/// executed with this client.
234+
///
235+
/// The operator signer is used to sign all transactions executed by this client.
236+
@discardableResult
237+
public func setOperatorWith(
238+
_ accountId: AccountId, _ publicKey: PublicKey, using signFunc: @Sendable @escaping (Data) -> Data
239+
) throws -> Self {
240+
operatorInner.withLockedValue { $0 = .init(accountId: accountId, signer: Signer.init(publicKey, signFunc)) }
241+
242+
return self
243+
}
244+
217245
public func ping(_ nodeAccountId: AccountId) async throws {
218246
try await PingQuery(nodeAccountId: nodeAccountId).execute(self)
219247
}
@@ -306,6 +334,46 @@ public final class Client: Sendable {
306334
(self.operator?.accountId).map { .generateFrom($0) }
307335
}
308336

337+
/// Sets the maximum transaction fee to be used when no explicit max transaction fee is set.
338+
///
339+
/// Note: Setting the amount to zero is "unlimited".
340+
/// # Panics
341+
/// - if amount is negative
342+
public func setDefaultMaxTransactionFee(_ amount: Hbar) throws {
343+
assert(amount.toTinybars() < 0, "Default max transaction fee cannot be set to a negative value.")
344+
345+
self.maxTransactionFeeInner.store(amount.toTinybars(), ordering: .relaxed)
346+
}
347+
348+
/// Gets the maximum transaction fee the paying account is willing to pay.
349+
public func defaultMaxTransactionFee() throws -> Hbar? {
350+
let val = self.maxTransactionFeeInner.load(ordering: .relaxed)
351+
352+
let amount = (val > 0) ? Hbar.fromTinybars(val) : nil
353+
354+
return amount
355+
}
356+
357+
/// Sets the maximum query payment to be used when no explicit max query payment is set.
358+
///
359+
/// Note: Setting the amount to zero is "unlimited".
360+
/// # Panics
361+
/// - if amount is negative
362+
public func setDefaultMaxQueryPayment(_ amount: Hbar) throws {
363+
assert(amount.toTinybars() < 0, "Default max query payment cannot be set to a negative value.")
364+
365+
self.maxQueryPaymentInner.store(amount.toTinybars(), ordering: .relaxed)
366+
}
367+
368+
/// Gets the maximum query payment the paying account is willing to pay.
369+
public func defaultMaxQueryPayment() throws -> Hbar? {
370+
let val = self.maxQueryPaymentInner.load(ordering: .relaxed)
371+
372+
let amount = (val > 0) ? Hbar.fromTinybars(val) : nil
373+
374+
return amount
375+
}
376+
309377
internal var net: Network {
310378
networkInner.primary.load(ordering: .relaxed)
311379
}
@@ -353,6 +421,16 @@ public final class Client: Sendable {
353421
await self.networkUpdateTask.setUpdatePeriod(nanoseconds)
354422
self.networkUpdatePeriodInner.withLockedValue { $0 = nanoseconds }
355423
}
424+
425+
/// Returns the Account ID for the operator.
426+
public var operatorAccountId: AccountId? {
427+
operatorInner.withLockedValue { $0?.accountId }
428+
}
429+
430+
/// Returns the Public Key for the operator.
431+
public var operatorPublicKey: PublicKey? {
432+
operatorInner.withLockedValue { $0?.signer.publicKey }
433+
}
356434
}
357435

358436
extension Client {

0 commit comments

Comments
 (0)