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

Support batching multiple RPC requests #187

Merged
merged 62 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
d020773
Add possibility of`id` modification in `JsonRpcPayload`
franciszekjob Apr 25, 2024
9f82f76
Merge branch 'main' of https://github.com/software-mansion/starknet.s…
franciszekjob Apr 25, 2024
b598af7
Refactor sending rpc request for `specVersion`
franciszekjob Apr 25, 2024
b6b9a40
Format
franciszekjob Apr 25, 2024
3801260
Add generic type of `params` in `HttpRequest` and `buildRequest`
franciszekjob May 7, 2024
a1d84d2
Refactor method signatures to return `HttpRequest`
franciszekjob May 7, 2024
b53eef0
Remove `makeRequest` and update methods to use `buildRequest`
franciszekjob May 7, 2024
5be5ad4
Change access levels of request param types
franciszekjob May 7, 2024
2af15e7
Update usage of `StarknetProvider` endpoints in tests
franciszekjob May 7, 2024
53879fc
Format
franciszekjob May 8, 2024
0adb281
Move`HttpRequest`. Add `HttpBatchRequest` and `Request`
franciszekjob May 8, 2024
f9df81b
Add `batchRequests` method
franciszekjob May 8, 2024
b00296b
Add `testBatchGetTransactionByHash` test
franciszekjob May 8, 2024
a2739d2
Update `testBatchGetTransactionByHash`
franciszekjob May 8, 2024
f681f58
Rename request files
franciszekjob May 10, 2024
00a123f
Remove `batchRequests` from `StarknetProviderProtocol`
franciszekjob May 10, 2024
d0b66f0
Order responses ordering
franciszekjob May 10, 2024
bfb3b25
Add `batchRequests` with variadic param `requests`
franciszekjob May 10, 2024
871aefc
Fix wrong variable name
franciszekjob May 10, 2024
1a74d7b
Update `testBatchGetTransactionByHash` test
franciszekjob May 10, 2024
33071cf
Merge branch 'main' of https://github.com/software-mansion/starknet.s…
franciszekjob May 10, 2024
2fd5b3b
Wrap values returned from `batchRequests` in `Result`
franciszekjob May 10, 2024
1beafcb
Add different transactions to `testBatchGetTransactionByHash`
franciszekjob May 12, 2024
697d340
Format
franciszekjob May 12, 2024
af2b884
Add incrementing `id` in json rpc requests
franciszekjob May 12, 2024
56f9916
Refactor `batchRequests`
franciszekjob May 12, 2024
c6554a4
Use variadic params in `testBatchGetTransactionByHash`
franciszekjob May 12, 2024
917e8c9
Refactor `send` in `BatchRequest`
franciszekjob May 12, 2024
ebb791b
Remove mistakenly copied `BatchRequest` class
franciszekjob May 13, 2024
05f7cdd
Refactor `send` and `sendbatch` methods in `HttpNetworkProvider`
franciszekjob May 15, 2024
53dd8d2
Add methods for encoding and response error handling to `HttpNetworkP…
franciszekjob May 15, 2024
a0de208
Change `handleEncodeError` to `handleEncodingError`
franciszekjob May 15, 2024
199657b
Merge branch 'main' of https://github.com/software-mansion/starknet.s…
franciszekjob May 15, 2024
fdee240
Update .gitignore
franciszekjob May 15, 2024
38c1773
Change return type of `StarknetAccount` methods to `Request`
franciszekjob May 16, 2024
4d77998
Merge branch 'feat/186-batch-multiple-rpc-requests' of https://github…
franciszekjob May 16, 2024
6811c24
Add `Starknet` prefix to `Request` and `BatchRequest`
franciszekjob May 16, 2024
55cc253
Restore let id in `JsonRpcPayload`
franciszekjob May 16, 2024
a9c3113
Verify error in `testBatchGetTransactionByHash`
franciszekjob May 16, 2024
85d70fc
Add test for json rpc responses with incorrect order
franciszekjob May 16, 2024
21bdc4b
Remove redundant constructors from request structs
franciszekjob May 16, 2024
0ac08b1
Add `StarknetProvider` extension; Move there `getHttpRequestConfigura…
franciszekjob May 16, 2024
d96c19f
Add separate provider for batching request tests
franciszekjob May 16, 2024
3e261bc
Update doc comments
franciszekjob May 20, 2024
48b7fe9
Merge branch 'main' into feat/186-batch-multiple-rpc-requests
franciszekjob May 28, 2024
3e8c6d3
Rename `getHttpRequestConfiguration()` to `prepareHttpRequestConfigur…
franciszekjob Jun 3, 2024
3438030
Merge branch 'feat/186-batch-multiple-rpc-requests' of https://github…
franciszekjob Jun 3, 2024
ed32ad6
Add `HttpNetworkProvider.encodePayload()`
franciszekjob Jun 3, 2024
f7d6f9a
Add `EncodableParams`
franciszekjob Jun 3, 2024
0f74e6c
Merge branch 'main' into feat/186-batch-multiple-rpc-requests
franciszekjob Jun 4, 2024
7f8749e
Update doc comment; Add `emptyRequestList` error
franciszekjob Jun 5, 2024
fbc89d9
Remove `public` from `encode()` methods
franciszekjob Jun 5, 2024
35ae6a2
Restore `EstimateMessageFeeParams` as public
franciszekjob Jun 5, 2024
64c9742
Rename `specVersion()` to `getSpecVersion()`
franciszekjob Jun 5, 2024
50f4ad7
Update Sources/Starknet/Network/StarknetRequest.swift
franciszekjob Jun 11, 2024
cb8cff3
Update Sources/Starknet/Network/StarknetBatchRequest.swift
franciszekjob Jun 11, 2024
161731a
Minor naming changes
franciszekjob Jun 11, 2024
a5ddd1e
Merge branch 'feat/186-batch-multiple-rpc-requests' of https://github…
franciszekjob Jun 11, 2024
4ea34f7
Update Sources/Starknet/Providers/StarknetProvider/JsonRpcParams.swift
franciszekjob Jun 11, 2024
5cfd536
Update `JsonRpcParams` cases naming; Remove `wrappedExecutableTransac…
franciszekjob Jun 11, 2024
94c718d
Move request batching methods to `StarknetProviderProtocol`
franciszekjob Jun 12, 2024
f5c82d4
Refactor `orderRpcResults`; Remove `batchProvider`
franciszekjob Jun 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,5 @@ iOSInjectionProject/
.swiftpm/config/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc

docs/*
56 changes: 27 additions & 29 deletions Sources/Starknet/Accounts/StarknetAccount.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,100 +86,100 @@ public class StarknetAccount: StarknetAccountProtocol {
return makeDeployAccountTransactionV3(classHash: classHash, salt: salt, calldata: calldata, signature: signature, params: params, forFeeEstimation: forFeeEstimation)
}

public func executeV1(calls: [StarknetCall], params: StarknetOptionalInvokeParamsV1) async throws -> StarknetInvokeTransactionResponse {
public func executeV1(calls: [StarknetCall], params: StarknetOptionalInvokeParamsV1) async throws -> StarknetRequest<StarknetInvokeTransactionResponse> {
var nonce: Felt
var maxFee: Felt

if let paramsNonce = params.nonce {
nonce = paramsNonce
} else {
nonce = try await getNonce()
nonce = try await getNonce().send()
}

if let paramsMaxFee = params.maxFee {
maxFee = paramsMaxFee
} else {
let feeEstimate = try await estimateFeeV1(calls: calls, nonce: nonce)
let feeEstimate = try await estimateFeeV1(calls: calls, nonce: nonce).send()[0]
maxFee = feeEstimate.toMaxFee()
}

let params = StarknetInvokeParamsV1(nonce: nonce, maxFee: maxFee)
let signedTransaction = try signV1(calls: calls, params: params, forFeeEstimation: false)

return try await provider.addInvokeTransaction(signedTransaction)
return provider.addInvokeTransaction(signedTransaction)
}

public func executeV3(calls: [StarknetCall], params: StarknetOptionalInvokeParamsV3) async throws -> StarknetInvokeTransactionResponse {
public func executeV3(calls: [StarknetCall], params: StarknetOptionalInvokeParamsV3) async throws -> StarknetRequest<StarknetInvokeTransactionResponse> {
var nonce: Felt
var resourceBounds: StarknetResourceBoundsMapping

if let paramsNonce = params.nonce {
nonce = paramsNonce
} else {
nonce = try await getNonce()
nonce = try await getNonce().send()
}

if let paramsResourceBounds = params.resourceBounds {
resourceBounds = paramsResourceBounds
} else {
let feeEstimate = try await estimateFeeV3(calls: calls, nonce: nonce)
let feeEstimate = try await estimateFeeV3(calls: calls, nonce: nonce).send()[0]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure getting the first estimate is a valid approach?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It has been discussed in previous thread
#187 (comment)

resourceBounds = feeEstimate.toResourceBounds()
}

let params = StarknetInvokeParamsV3(nonce: nonce, l1ResourceBounds: resourceBounds.l1Gas)
let signedTransaction = try signV3(calls: calls, params: params, forFeeEstimation: false)

return try await provider.addInvokeTransaction(signedTransaction)
return provider.addInvokeTransaction(signedTransaction)
}

public func executeV1(calls: [StarknetCall], estimateFeeMultiplier: Double) async throws -> StarknetInvokeTransactionResponse {
let nonce = try await getNonce()
let feeEstimate = try await estimateFeeV1(calls: calls, nonce: nonce)
public func executeV1(calls: [StarknetCall], estimateFeeMultiplier: Double) async throws -> StarknetRequest<StarknetInvokeTransactionResponse> {
let nonce = try await getNonce().send()
let feeEstimate = try await estimateFeeV1(calls: calls, nonce: nonce).send()[0]
let maxFee = feeEstimate.toMaxFee(multiplier: estimateFeeMultiplier)

let params = StarknetInvokeParamsV1(nonce: nonce, maxFee: maxFee)
let signedTransaction = try signV1(calls: calls, params: params, forFeeEstimation: false)

return try await provider.addInvokeTransaction(signedTransaction)
return provider.addInvokeTransaction(signedTransaction)
}

public func executeV3(calls: [StarknetCall], estimateAmountMultiplier: Double, estimateUnitPriceMultiplier: Double) async throws -> StarknetInvokeTransactionResponse {
let nonce = try await getNonce()
let feeEstimate = try await estimateFeeV3(calls: calls, nonce: nonce)
public func executeV3(calls: [StarknetCall], estimateAmountMultiplier: Double, estimateUnitPriceMultiplier: Double) async throws -> StarknetRequest<StarknetInvokeTransactionResponse> {
let nonce = try await getNonce().send()
let feeEstimate = try await estimateFeeV3(calls: calls, nonce: nonce).send()[0]
let resourceBounds = feeEstimate.toResourceBounds(amountMultiplier: estimateAmountMultiplier, unitPriceMultiplier: estimateUnitPriceMultiplier)

let params = StarknetInvokeParamsV3(nonce: nonce, l1ResourceBounds: resourceBounds.l1Gas)
let signedTransaction = try signV3(calls: calls, params: params, forFeeEstimation: false)

return try await provider.addInvokeTransaction(signedTransaction)
return provider.addInvokeTransaction(signedTransaction)
}

public func estimateFeeV1(calls: [StarknetCall], nonce: Felt, skipValidate: Bool) async throws -> StarknetFeeEstimate {
public func estimateFeeV1(calls: [StarknetCall], nonce: Felt, skipValidate: Bool) async throws -> StarknetRequest<[StarknetFeeEstimate]> {
let params = StarknetInvokeParamsV1(nonce: nonce, maxFee: .zero)
let signedTransaction = try signV1(calls: calls, params: params, forFeeEstimation: true)

return try await provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
return provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
}

public func estimateFeeV3(calls: [StarknetCall], nonce: Felt, skipValidate: Bool) async throws -> StarknetFeeEstimate {
public func estimateFeeV3(calls: [StarknetCall], nonce: Felt, skipValidate: Bool) async throws -> StarknetRequest<[StarknetFeeEstimate]> {
let params = StarknetInvokeParamsV3(nonce: nonce, l1ResourceBounds: .zero)
let signedTransaction = try signV3(calls: calls, params: params, forFeeEstimation: true)

return try await provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
return provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
}

public func estimateDeployAccountFeeV1(classHash: Felt, calldata: StarknetCalldata, salt: Felt, nonce: Felt, skipValidate: Bool) async throws -> StarknetFeeEstimate {
public func estimateDeployAccountFeeV1(classHash: Felt, calldata: StarknetCalldata, salt: Felt, nonce: Felt, skipValidate: Bool) async throws -> StarknetRequest<[StarknetFeeEstimate]> {
let params = StarknetDeployAccountParamsV1(nonce: nonce, maxFee: 0)
let signedTransaction = try signDeployAccountV1(classHash: classHash, calldata: calldata, salt: salt, params: params, forFeeEstimation: true)

return try await provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
return provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
}

public func estimateDeployAccountFeeV3(classHash: Felt, calldata: StarknetCalldata, salt: Felt, nonce: Felt, skipValidate: Bool) async throws -> StarknetFeeEstimate {
public func estimateDeployAccountFeeV3(classHash: Felt, calldata: StarknetCalldata, salt: Felt, nonce: Felt, skipValidate: Bool) async throws -> StarknetRequest<[StarknetFeeEstimate]> {
let params = StarknetDeployAccountParamsV3(nonce: nonce, l1ResourceBounds: .zero)
let signedTransaction = try signDeployAccountV3(classHash: classHash, calldata: calldata, salt: salt, params: params, forFeeEstimation: true)

return try await provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
return provider.estimateFee(for: signedTransaction, simulationFlags: skipValidate ? [.skipValidate] : [])
}

public func sign(typedData: StarknetTypedData) throws -> StarknetSignature {
Expand All @@ -197,7 +197,7 @@ public class StarknetAccount: StarknetAccountProtocol {
)

do {
let result = try await provider.callContract(call)
let result = try await provider.callContract(call).send()

guard result.count == 1 else {
throw StarknetAccountError.invalidResponse
Expand All @@ -219,9 +219,7 @@ public class StarknetAccount: StarknetAccountProtocol {
// And we want to rethrow all other errors.
}

public func getNonce() async throws -> Felt {
let result = try await provider.getNonce(of: address)

return result
public func getNonce() async throws -> StarknetRequest<Felt> {
provider.getNonce(of: address)
}
}