-
open Xcode project > select File > Swift Packages > Add Package Dependency
-
Enter the url https://github.com/torusresearch/tkey-rust-ios
After installation, the next step to using Web3Auth CoreKit SDK is to Initialize the SDK. The Initialization takes a few steps, including initiating the tKey SDK with the service provider and modules.
Service Provider in tKey is used for generating a Share A, i.e. the private key share managed by a wallet service provider via their authentication flows. This share in our key infrastructure refers to the social login aspect, where we associate a private key share with the user's social login, enabling the seamless login experience.
In order to configure your service provider, you must use CustomAuth Swift SDK. Since CustomAuth Swift SDK is not automatically installed when you install tkey ios SDK, let's start with installation first.
You can find more detailed document here.
In project settings, add the Github URL as a swift package dependency.
import PackageDescription
let package = Package(
name: "CustomAuth",
dependencies: [
.package(name: "CustomAuth", url: "https://github.com/torusresearch/customauth-swift-sdk", from: "2.4.0"))
]
)
pod 'CustomAuth', '~> 5.0.0'
If you require a package manager other than SPM or Cocoapods, do reach out to hello@tor.us or alternatively clone the repo manually and import as a framework in your project
Initalize the SDK depending on the login you require. The example below does so for a single google login.
redirectURL
refers to a url for the login flow to redirect into your app, it should have a scheme that is registered by your app, for examplecom.mycompany.myapp://redirect
.browserRedirectURL
refers to a page that the browser should use in the login flow, it should have a http or https scheme.
import CustomAuth
let sub = SubVerifierDetails(loginType: .web, // default .web
loginProvider: .google,
clientId: "<your-client-id>",
verifierName: "<verifier-name>",
redirectURL: "<your-redirect-url>",
browserRedirectURL: "<your-browser-redirect-url>")
let tdsdk = CustomAuth(aggregateVerifierType: "<type-of-verifier>", aggregateVerifierName: "<verifier-name>", subVerifierDetails: [sub], network: <etherum-network-to-use>)
// controller is used to present a SFSafariViewController.
tdsdk.triggerLogin(controller: <UIViewController>?, browserType: <method-of-opening-browser>, modalPresentationStyle: <style-of-modal>).done{ data in
print("private key rebuild", data)
}.catch{ err in
print(err)
}
Documentation of browser type and modal presentation style can be found in CustomAuth repo[https://github.com/torusresearch/customauth-swift-sdk].
Logins are dependent on verifier scripts/verifiers. There are other verifiers
including single_id_verifier
, and_aggregate_verifier
,
or_aggregate_verifier
and single_logins
of which you may need to use
depending on your required logins. To get your application's verifier script
setup, do reach out to hello@tor.us or to read more about verifiers do checkout
the docs.
triggerLogin()
returns a promise that resolve with a Dictionary that contain at leastprivateKey
andpublicAddress
field.- Initialize the service provider with the privateKey retrived by result of
triggerLogin()
.
tdsdk.triggerLogin(controller: <UIViewController>?, browserType: <method-of-opening-browser>, modalPresentationStyle: <style-of-modal>).done{ data in
print("private key rebuild", data)
let key = data["privateKey"]
service_provider = try! ServiceProvider(enable_logging: true, postbox_key: key)
}.catch{ err in
print(err)
}
Natively, the instance of tKey, (ie. ThresholdKey) returns many functions, however, we have documented a few relevant ones here. You can check the table below for a list of all relevant functions.
Function | Description | Arguments | Async | return |
---|---|---|---|---|
initialize |
Generates a Threshold Key object corresponding to your login provider. | import_share: String , input: ShareStore? , never_initialize_new_key: Bool , include_local_metadata_transitions: Bool |
Yes | KeyDetails |
reconstruct |
Reconstructs the user private key (minimum threshold no. of shares required) | void |
Yes | KeyReconstructionDetails |
reconstruct_latest_poly |
Returns the latest polynomial from all the available shares (for this pub-poly). We using Lagrange's interpolation to derive the polynomial | void |
No | Polynomial |
get_all_share_stores_for_latest_polynomial |
Get all available ShareStores from latest polynomial | void |
No | ShareStoreArray |
generate_new_share |
Generate a new share for the reconstructed private key. | void |
Yes | GenerateShareStoreResult |
delete_share |
Delete a share from private key. | share_index: String |
Yes | void |
CRITICAL_delete_tkey |
Deletes a threshold key, all shares will be removed, use with caution | void |
Yes | void |
get_key_details |
Get the details of the keys. | void |
No | KeyDetails |
output_share |
Output a share from the tKey | shareIndex: String, shareType: String? |
No | String |
share_to_share_store |
Convert Share to ShareStore | share: String |
No | ShareStore |
input_share |
Adds an existing share to tkey. | share: String , shareType: String? |
Yes | void |
output_share_store |
Output a share store from the tKey | shareIndex: String, polyId: String? |
No | ShareStore |
input_share_store |
Input a share store into the tKey | shareStore: ShareStore |
Yes | void |
get_shares_indexes |
Returns an array of all the share indexes from latest polynomial | void |
No | [String] |
encrypt |
Encrypt a message/data with the provided publicKey. | msg: String |
No | String |
decrypt |
Decrypt a message/data with the provided publicKey. | msg: String |
No | String |
get_tkey_store |
Returns data from tkey store given a module name | moduleName: String |
No | [[String:Any]] |
get_tkey_store_item |
Returns data from tkey store given id and a module name | moduleName: String , id: String |
No | String |
get_shares |
get shares from tKey | void |
No | ShareStorePolyIdIndexMap |
get_share_descriptions |
Get a description to a share | void |
No | [String: [String]] |
add_share_description |
Add a description to a share | key: String, description: String, update_metadata: Bool |
Yes | void |
update_share_description |
Update a description to a share | key: String, oldDescription: String, newDescription: String, update_metadata: Bool |
Yes | void |
delete_share_description |
Delete a description to a share | key: String, description: String, update_metadata: Bool |
Yes | void |
CustomAuth.triggerLogin()
returns a Dictionary which contains the user's information and details about the login. You can access the information within it to get the user details from the login provider. The contents of the dictionary may vary depending on the verifier (single_id_verifier
,and_aggregate_verifier
,or_aggregate_verifier
andsingle_logins
).
SubVerifierDetails
SubVerifierDetails are the details of each subverifiers to be used.
Parameter | Type | Description | Mandatory |
---|---|---|---|
loginType | SubVerifierType | Type of your login verifier | No |
loginProvider | LoginProviders | Yes | |
clientId | String | Client ID from your login service provider | Yes |
verifier | String | Verifier Name from Web3Auth Dashboard | Yes |
redirectURL | String | Yes | |
browserRedirectURL | String? | No | |
jwtParams | [String: String] | Additional JWT Params | No |
urlSession | URLSession | No |
import CustomAuth
let sub = SubVerifierDetails(loginType: .web, // web || installed
//example of login using a google
loginProvider: .google,
clientId: "<your-client-id>",
verifierName: "<verifier-name>",
redirectURL: "<your-redirect-url>",
browserRedirectURL: "<your-browser-redirect-url>")
let tdsdk = CustomAuth(aggregateVerifierType: "<type-of-verifier>", aggregateVerifierName: "<verifier-name>", subVerifierDetails: [sub], network: <etherum-network-to-use>)
// controller is used to present a SFSafariViewController.
tdsdk.triggerLogin(controller: <UIViewController>?, browserType: <method-of-opening-browser>, modalPresentationStyle: <style-of-modal>).done{ data in
print("private key rebuild", data)
}.catch{ err in
print(err)
}
# Example
let sub = SubVerifierDetails(loginType: .web,
loginProvider: .google,
clientId: <your-client-id>,
verifierName: "google-pepper",
redirectURL: "tdsdk://tdsdk/oauthCallback",
browserRedirectURL: "https://scripts.toruswallet.io/redirect.html")
let tdsdk = CustomAuth(aggregateVerifierType: .singleLogin, aggregateVerifierName: "google-pepper", subVerifierDetails: [sub], network: .ROPSTEN)
tdsdk.triggerLogin().done { userdata in
print("private key rebuild", userdata)
}.catch { err in
print(err)
}
Once you have triggered the login process, you're ready to initialize the tKey. This will generate a Threshold Key corresponding to your login provider.
let key_details = try! await threshold_key.initialize(never_initialize_new_key: false, include_local_metadata_transitions: false)
Parameter | Type | Description | Mandatory |
---|---|---|---|
import_share | String | Initialise tkey with an existing share store. This allows you to directly initialise tKey without using the service provider login. | No |
input | OpaquePointer? | Import a key into tkey for initialisation. | No |
never_initialize_new_key | Bool | Never initialise using a new key if account not found | Yes |
include_local_metadata_transitions | Bool | Pass the previous transition metadata | Yes |
let key_details = try! threshold_key.get_key_details()
The function get_key_details() returns the details of the keys present generated for the specific user. This includes the public key X & Y of the user, alongside the shares details and the threshold.
[
{
pubKey: {
x: "471dbccd7e55eb2d24..329b8174f2339e516a3d1728d",
y: "3f93da3597ded482fc..b23c5c79011a3deb8ccf8bf50",
},
requiredShares: -9,
threshold: 2,
totalShares: 11,
shareDescriptions: {
"1": [
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671429485524}',
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671429560829}',
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671454332687}',
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671454508464}',
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671454832067}',
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671506806091}',
],
"94da7ea9b8680ea13d..1de31915c54c1cfa055134308969088": [
'{"module":"webStorage","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","dateAdded":1671424397242}',
],
"9b29f5c69bdcc4c79b..8c573e3001d72dc7a42866e88272866": [
'{"module":"securityQuestions","questions":"whats your password?","dateAdded":1671424430842}',
],
},
},
];
The function reconstruct()
reconstructs the private key of the user from the shares. This function returns the private key of the user once the threshold has been met.
let reconstructedKeyResult = try! await threshold_key.reconstruct()
public final class KeyReconstructionDetails: Codable {
public var key: String
public var seed_phrase: [String]
public var all_keys: [String]
}
The function generate_new_share()
generates a new share on the same threshold (e.g, 2/3 -> 2/4). This function returns the new share generated.
let newShare = try! await threshold_key.generate_new_share()
The function delete_share()
deletes a share from the user's shares. This function returns the updated shareStore after the share has been deleted.
let shareStore = try! await threshold_key.delete_share(share_index: idx)
For making advanced operations on tKey and to manipulate the keys, you can use the modules provided by tKey. As mentioned in the initialization section, you need to configure the modules beforehand to make it work with tKey. Once that is done, the instance of the respective module is available within your tKey instance and can be used for further operations.
Once you have generated the private key, you can use it to make blockchain calls. The key generated by tKey SDK (secp256k1 curve) is compatible with EVM-based blockchains like Ethereum, Polygon, and many others that use the same curve. However, you can also convert this key into other curves and utilize it. For example, we have a dedicated package for converting this key to the ed25519 compatible private key. This key can be used in Solana and other blockchains that use this curve.
In addition to that, we have dedicated provider packages for EVM and Solana Blockchain libraries. You can check out their respective documentation here:
Getting a Ethereum Provider from tKey: Ethereum Provider Getting a Solana Provider from tKey: Solana Provider
The PrivateKeysModule module provides an interface for setting, getting and managing private keys for a ThresholdKey object.
To use the PrivateKeysModule in your Swift project, you will need to import the module as follows:
import tkey_pkg
Function | Description | Arguments | Async | return |
---|---|---|---|---|
set_private_key |
Set private key to corresponding tKey | threshold_key: ThresholdKey, key: String?, format: String |
Yes | Bool |
get_private_keys |
Get Private Keys | tthreshold_key: ThresholdKey |
No | [[String:String]] |
get_private_key_accounts |
Get private Key accounts | threshold_key: ThresholdKey |
No | [String] |
Sets a private key for a ThresholdKey object.
Parameters:
- threshold_key: A ThresholdKey object.
- key: A private key in string format.
- format: A string representing the format of the private key.
Returns:
- Bool: A boolean indicating whether the operation succeeded or not.
- Returns a list of private keys for a ThresholdKey object.
Parameters:
- threshold_key: A ThresholdKey object.
Returns:
- [[String:String]]: A list of private keys as dictionaries.
Throws:
- RuntimeError: If there is an error in the underlying C code.
- Returns a list of accounts for which private keys are available.
Parameters:
- threshold_key: A ThresholdKey object.
Throws:
- RuntimeError: If there is an error in the underlying C code.
Returns:
- [String]: A list of accounts for which private keys are available.
Function | Description | Arguments | Async | return |
---|---|---|---|---|
generate_new_share |
generate a new Share with security question | threshold_key: ThresholdKey, questions: String, answer: String |
Yes | GenerateShareStoreResult |
input_share |
input share from security question | threshold_key: ThresholdKey, answer: String |
Yes | Bool |
change_question_and_answer |
Get private Key accounts | threshold_key: ThresholdKey, questions: String, answer: String |
Yes | Bool |
store_answer |
Store answer of security question in tKey | threshold_key: ThresholdKey, answer: String |
Yes | Bool |
get_answer |
Get answer of security question stored in tKey | threshold_key: ThresholdKey |
No | String |
get_questions |
Get security questions stored in tKey | threshold_key: ThresholdKey |
No | String |
generate_new_share(threshold_key: ThresholdKey, questions: String, answer: String ) async throws -> GenerateShareStoreResult
This function generates a new share for a given ThresholdKey, along with the user's security question and answer.
Parameters:
- threshold_key: A ThresholdKey object representing the key for which to generate a new share.
- questions: A String representing the user's security question.
- answer: A String representing the user's security answer.
Returns
- GenerateShareStoreResult: A struct that contains information about the new share that was generated.
Throws
- Error: An error if the operation failed.
A method that inputs a share for a threshold key based on a security question and answer.
Parameters
- threshold_key: A ThresholdKey instance for which to input a share.
- answer: A String representing the answer to the security questions.
Returns
- Bool: true if the share was successfully input, false otherwise.
Throws
- Error: An error if the operation failed.
change_question_and_answer(threshold_key: ThresholdKey, questions: String, answer: String ) async throws -> Bool
A method that changes the security questions and answers for a threshold key.
Parameters
- threshold_key: A ThresholdKey instance for which to change the security questions and answers.
- questions: A String representing a new set of security questions to be answered.
- answer: A String representing the answer to the security questions.
Returns
- Bool: true if the security questions and answers were successfully changed, false otherwise.
Throws
- Error: An error if the operation failed.
A method that stores the answer to a security question for a threshold key.
Parameters
- threshold_key: A ThresholdKey instance for which to store the answer to a security question.
- answer: A String representing the answer to the security question.
Returns
- Bool: true if the answer was successfully stored, false otherwise.
Throws
- Error: An error if the operation failed.
Get answer of security question stored in tKey.
Parameters
- threshold_key: A ThresholdKey instance for which to store the answer to a security question.
Returns
- String: A String representing the answer to the security questions.
Throws
- Error: An error if the operation failed.
This method gets security questions stored in tKey.
Parameters
- threshold_key: A ThresholdKey instance for which to store the answer to a security question.
Returns
- String: A String representing the user's security question.
Throws
- Error: An error if the operation failed.
SeedPhraseModule is a Swift module that provides functionality for setting, changing, getting, and deleting seed phrases for a ThresholdKey object.
To use the SeedPhraseModule in your Swift project, you will need to import the module as follows:
import tkey_pkg
Function | Description | Arguments | Async | return |
---|---|---|---|---|
set_seed_phrase |
Set seed phrase to corresponding tKey | threshold_key: ThresholdKey, format: String, phrase: String?, number_of_wallets: UInt32 |
Yes | void |
change_phrase |
Changes specific seed phrase | threshold_key: ThresholdKey, old_phrase: String, new_phrase: String |
Yes | void |
get_seed_phrases |
Gets all seed phrases stored in tKey. | threshold_key: ThresholdKey |
Yes | [seedPhraseStruct] |
delete_seed_phrase |
Delete the seed phrase | threshold_key: ThresholdKey, phrase: String |
Yes | void |
set_seed_phrase(threshold_key: ThresholdKey, format: String, phrase: String?, number_of_wallets: UInt32) async throws
This function sets the seed phrase for the given ThresholdKey.
Parameters
- threshold_key: The ThresholdKey object to set the seed phrase for.
- format: The format of the seed phrase.
- phrase: The seed phrase. If nil, a random seed phrase is generated.
- number_of_wallets: The number of wallets to derive from the seed phrase.
Throws
- Error: An error if the operation fails.
This function changes the seed phrase of the given ThresholdKey. The old_phrase parameter specifies the old seed phrase, and the new_phrase parameter specifies the new seed phrase. The function is asynchronous and can throw an error.
Parameters
- threshold_key: The ThresholdKey object to change the seed phrase for.
- old_phrase: The old seed phrase.
- new_phrase: The new seed phrase.
Throws
- Error: An error if the operation fails.
This function returns an array of seedPhraseStruct objects, which contain the seed phrases and their type for the given ThresholdKey.
Parameters
- threshold_key: The ThresholdKey object to get the seed phrases for.
Throws
- Error: An error if the operation fails.
Returns
- seedPhraseStruct
This method deletes a seed phrase from the given ThresholdKey.
Parameters
- threshold_key: The ThresholdKey instance from which to delete the seed phrase.
- phrase: The seed phrase to delete, as a string.
Throws
- Error: An error if the operation fails.
The ShareSerializationModule is a Swift module that provides functionality for serializing and deserializing threshold key shares.
To use the ShareSerializationModule in your Swift project, you will need to import the module as follows:
import tkey_pkg
Function | Description | Arguments | Async | return |
---|---|---|---|---|
serialize_share |
Serialize share | threshold_key: ThresholdKey, share: String, format: String? |
No | String |
deserialize_share |
Deserialize share | threshold_key: ThresholdKey, share: String, format: String? |
No | String |
This method serializes a threshold key share and returns it as a string.
- threshold_key: A ThresholdKey object that represents the threshold key to which the share belongs.
- share: A string that represents the share to be serialized.
- format: An optional string that represents the serialization format. If it is not specified, the default format will be used.
- RuntimeError: If the serialization operation fails, a RuntimeError will be thrown.
- A string that represents the serialized share.
This method deserializes a threshold key share and returns it as a string.
- threshold_key: A ThresholdKey object that represents the threshold key to which the share belongs.
- share: A string that represents the share to be deserialized.
- format: An optional string that represents the serialization format. If it is not specified, the default format will be used.
- RuntimeError: If the deserialization operation fails, a RuntimeError will be thrown.
- A string that represents the deserialized share.
The ShareTransferModule is a Swift module that provides functions for requesting, approving and transfering a share to another device.
To use the ShareTransferModule in your Swift project, you will need to import the module as follows:
import tkey_pkg
Function | Description | Arguments | Async | return |
---|---|---|---|---|
request_new_share |
request a new share | threshold_key: ThresholdKey, user_agent: String, available_share_indexes: String |
Yes | String |
add_custom_info_to_request |
Add custom info to share request | threshold_key: ThresholdKey, enc_pub_key_x: String, custom_info: String |
Yes | void |
look_for_request |
Returns an array of indexes of pending requests | threshold_key: ThresholdKey |
Yes | [String] |
approve_request |
approve the shareStore to be shared | threshold_key: ThresholdKey, enc_pub_key_x: String, share_store: ShareStore |
Yes | void |
approve_request_with_share_index |
approve sharing with share index | threshold_key: ThresholdKey, enc_pub_key_x: String, share_index: String |
Yes | void |
get_store |
Get share transfer store | threshold_key: ThresholdKey |
Yes | ShareTransferStore |
set_store |
Set share transfer store | threshold_key: ThresholdKey, store: ShareTransferStore |
Yes | Bool |
delete_store |
Delete share transfer store | threshold_key: ThresholdKey, enc_pub_key_x: String |
Yes | Bool |
get_current_encryption_key |
Get security questions stored in tKey | threshold_key: ThresholdKey |
No | String |
request_status_check |
start request status checking | threshold_key: ThresholdKey, enc_pub_key_x: String, delete_request_on_completion: Bool |
Yes | ShareStore |
cleanup_request |
cleanup the request | threshold_key: ThresholdKey |
No | Bool |
request_new_share(threshold_key: ThresholdKey, user_agent: String, available_share_indexes: String ) async throws -> String
Request a new share for the given user.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- user_agent: A string representing the user's user agent.
- available_share_indexes: A string representing the available share indexes for the user.
Returns:
- String: A string representing the requested share.
add_custom_info_to_request(threshold_key: ThresholdKey, enc_pub_key_x: String, custom_info: String ) async throws
Adds custom information to a share request.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- enc_pub_key_x: A string representing the user's encryption public key.
- custom_info: A string representing the custom information to add to the request.
Check the status of the user's share request.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
Returns:
- [String]: An array of strings representing the status of the user's share request.
approve_request(threshold_key: ThresholdKey, enc_pub_key_x: String, share_store: ShareStore ) async throws
Approves a share request for the user.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- enc_pub_key_x: A string representing the user's encryption public key.
- share_store: A ShareStore object representing the user's share store.
approve_request_with_share_index(threshold_key: ThresholdKey, enc_pub_key_x: String, share_index: String ) async throws
Approves a share request for the user using a specific share index.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- enc_pub_key_x: A string representing the user's encryption public key.
- share_index: A string representing the specific share index to use for the share request.
Get the user's share store.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
Returns:
- ShareTransferStore: A ShareTransferStore object representing the user's share store.
Set the user's share store.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- store: A ShareTransferStore object representing the user's share store.
Returns:
- Bool: A boolean value indicating whether the operation was successful.
Delete the user's share store.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
- enc_pub_key_x: A string representing the user's encryption public key.
Returns:
- Bool: A boolean value indicating whether the operation was successful.
This method is used to get the current encryption key for the given threshold_key.
Parameters:
- threshold_key: A ThresholdKey object representing the user's threshold key.
Throws:
- ShareTransferError: If there is an issue with the underlying share transfer module.
- RuntimeError: If there is an issue with the runtime environment.
Returns:
- String: A string value representing the current encryption key.
request_status_check(threshold_key: ThresholdKey, enc_pub_key_x: String, delete_request_on_completion: Bool ) async throws -> ShareStore
This method is used to check the status of a request for the specified enc_pub_key_x under the given threshold_key. Parameters:
- threshold_key: The ThresholdKey object for the associated share transfer module.
- enc_pub_key_x: The encrypted public key X for the request to be checked.
- delete_request_on_completion: A boolean value indicating whether the request should be deleted upon completion.
Throws:
- ShareTransferError: If there is an issue with the underlying share transfer module.
- RuntimeError: If there is an issue with the runtime environment.
Returns:
- ShareStore: A ShareStore object representing the current status of the request.
This method is used to clean up any remaining requests for the specified threshold_key.
Parameters:
- threshold_key: The ThresholdKey object for the associated share transfer module.
Throws:
- ShareTransferError: If there is an issue with the underlying share transfer module.
- RuntimeError: If there is an issue with the runtime environment.