Public methods 📢
Get SDK-instance info
Returns:
an instance of
InfoDatacontaining SDK-related properties.
public async Task<InfoData> getInfo() {
return new InfoData {
apiKey = this.apiKey,
dAppCode = this.dAppCode,
network = this.network,
visitorId = "[not implemented yet]",
sdkEnvironment = this.sdkEnvironment,
sdkVersion = this.sdkVersion
};
}Get balances by Hedera id (address)
Parameters:
accountId: Hedera id (address), example: 0.0.112233
Returns:
an instance of
AccountBalanceDatacontaining account hbar and token balances.
public async Task<AccountBalanceData> getBalance(string accountId) {
return await apiService.getBalance(accountId);
}Get account evmAddress and calculated evmAddress from public key
Parameters:
accountId: Hedera id (address), example: 0.0.112233
Returns:
an instance of
AccountInfoDatacontaining account id, evmAddress, calculatedEvmAddress
public async Task<AccountInfoData> getAccountInfo(string accountId) {
var account = await apiService.GET<AccountData>($"/api/v1/accounts/{accountId}");
string response = engine
.Evaluate($"window.bladeSdk.getAccountInfo('{accountId}', '{account.evm_address}', '{account.key.key}')")
.UnwrapIfPromise()
.ToString();
return this.processResponse<AccountInfoData>(response);
}Method to execute Hbar transfers from current account to receiver
Parameters:
accountId: senderaccountPrivateKey: sender's private key to sign transfer transactionreceiverId: receiveramount: amountmemo: memo (limited to 100 characters)
Returns:
an instance of
ExecuteTxReceiptcontaining transaction receipt
public async Task<ExecuteTxReceipt> transferHbars(string accountId, string accountPrivateKey, string recieverAccount, string amount, string memo) {
string response = engine
.Evaluate($"window.bladeSdk.transferHbars('{accountId}', '{accountPrivateKey}', '{recieverAccount}', '{amount}', '{memo}')")
.UnwrapIfPromise()
.ToString();
SignedTx signedTx = this.processResponse<SignedTx>(response);
return await apiService.executeTx(signedTx.tx, signedTx.network);
}Method to execute token transfers from current account to receiver
Parameters:
tokenId: tokenaccountId: senderaccountPrivateKey: sender's private key to sign transfer transactionreceiverId: receiveramount: amountmemo: memo (limited to 100 characters)freeTransfer: for tokens configured for this dAppCode on Blade backend
Returns:
an instance of
ExecuteTxReceiptcontaining transaction receipt
public async Task<ExecuteTxReceipt> transferTokens(string tokenId, string accountId, string accountPrivateKey, string recieverAccount, string amount, string memo, bool freeTransfer = false) {
TokenData meta = await apiService.GET<TokenData>($"/api/v1/tokens/{tokenId}");
double correctedAmount = double.Parse(amount) * Math.Pow(10, int.Parse(meta.decimals));
if (freeTransfer == true) {
// for free transfer BladeApi need to create TX, from our initial data.
// to call BladeApi we need TVTE-token
// after we get transactionBytes need to sign it with sender private key
// after signing - need to execute this TX
// generating TVTE token
string response = engine
.Evaluate($"window.bladeSdk.getTvteValue()")
.UnwrapIfPromise()
.ToString();
TVTEResponse tvteResponse = this.processResponse<TVTEResponse>(response);
// bladeApi create and sign TX, and return base64-encoded transactionBytes
FreeTokenTransferResponse freeTokenTransferResponse = await apiService.freeTokenTransfer(accountId, recieverAccount, correctedAmount, memo, tvteResponse.tvte);
// sign with sender private key
SignedTx signedTx = this.signTransaction(freeTokenTransferResponse.transactionBytes, "base64", accountPrivateKey);
//send tx to execution
return await apiService.executeTx(signedTx.tx, signedTx.network);
} else {
string response = engine
.Evaluate($"window.bladeSdk.transferTokens('{tokenId}', '{accountId}', '{accountPrivateKey}', '{recieverAccount}', {correctedAmount}, '{memo}')")
.UnwrapIfPromise()
.ToString();
SignedTx signedTx = this.processResponse<SignedTx>(response);
return await apiService.executeTx(signedTx.tx, signedTx.network);
}
}Method to create Hedera account
Parameters:
deviceId: unique device id (advanced security feature, required only for some dApps)
Returns:
an instance of
CreateAccountDatacontaining new account data
public async Task<CreateAccountData> createAccount(string deviceId) {
// generateKeys
string keyResponse = engine
.Evaluate($"window.bladeSdk.generateKeys()")
.UnwrapIfPromise()
.ToString();
KeyPairData keyPairData = this.processResponse<KeyPairData>(keyResponse);
string tvteToken = this.getTvteToken();
CreateAccountResponse createAccountResponse = await apiService.createAccount(keyPairData.publicKey, deviceId, tvteToken);
// sign and execute transactions if any
if (createAccountResponse.updateAccountTransactionBytes != null) {
SignedTx signedTx = this.signTransaction(createAccountResponse.updateAccountTransactionBytes, "base64", keyPairData.privateKey);
ExecuteTxReceipt executeTxReceipt = await apiService.executeTx(signedTx.tx, signedTx.network);
// confirm account key update
if (executeTxReceipt.status == "SUCCESS") {
await apiService.confirmAccountUpdate(createAccountResponse.id, tvteToken);
}
}
if (createAccountResponse.transactionBytes != null) {
SignedTx signedTx = this.signTransaction(createAccountResponse.transactionBytes, "base64", keyPairData.privateKey);
ExecuteTxReceipt executeTxReceipt = await apiService.executeTx(signedTx.tx, signedTx.network);
}
CreateAccountData createAccountData = new CreateAccountData {
transactionId = createAccountResponse.transactionId,
status = string.IsNullOrEmpty(createAccountResponse.transactionId) ? "SUCCESS" : "PENDING",
seedPhrase = "[not supported in now]",
publicKey = keyPairData.publicKey,
privateKey = keyPairData.privateKey,
accountId = createAccountResponse.id,
evmAddress = keyPairData.evmAddress
};
return createAccountData;
}Method to delete Hedera account
Parameters:
deleteAccountId: account to delete - iddeletePrivateKey: account to delete - private keytransferAccountId: The ID of the account to transfer the remaining funds to.operatorAccountId: operator account IdoperatorPrivateKey: operator account private key
Returns:
an instance of
ExecuteTxReceiptcontaining transaction receipt
public async Task<ExecuteTxReceipt> deleteAccount(string deleteAccountId, string deletePrivateKey, string transferAccountId, string operatorAccountId, string operatorPrivateKey) {
string signedTxResponse = engine
.Evaluate($"window.bladeSdk.deleteAccount('{deleteAccountId}', '{deletePrivateKey}', '{transferAccountId}', '{operatorAccountId}', '{operatorPrivateKey}')")
.UnwrapIfPromise()
.ToString();
SignedTx signedTx = this.processResponse<SignedTx>(signedTxResponse);
return await apiService.executeTx(signedTx.tx, signedTx.network);
}Method to call smart-contract function
Parameters:
contractId: contract idfunctionName: contract function nameparams: function arguments (instance of ContractFunctionParameters)accountId: sender account idaccountPrivateKey: sender's private key to sign transfer transactiongas: gas amount for transaction (default 100000)bladePayFee: blade pay fee, otherwise fee will be pay from sender accountId
Returns:
an instance of
ExecuteTxReceiptcontaining transaction receipt
public async Task<ExecuteTxReceipt> contractCallFunction(string contractId, string functionName, ContractFunctionParameters parameters, string accountId, string accountPrivateKey, uint gas, bool bladePayFee = false) {
if (bladePayFee) {
string contractCallBytecodeResponse = engine
.Evaluate($"window.bladeSdk.getContractCallBytecode('{functionName}', '{parameters.encode()}')")
.UnwrapIfPromise()
.ToString();
ContractCallBytecode contractCallBytecode = this.processResponse<ContractCallBytecode>(contractCallBytecodeResponse);
SignContractCallResponse signContractCallResponse = await apiService.signContractCallTx(
contractCallBytecode.contractFunctionParameters,
contractId,
functionName,
gas,
this.getTvteToken(),
false
);
SignedTx signedTx = this.signTransaction(signContractCallResponse.transactionBytes, "base64", accountPrivateKey);
return await apiService.executeTx(signedTx.tx, signedTx.network);
} else {
string signedTxResponse = engine
.Evaluate($"window.bladeSdk.contractCallFunctionTransaction('{contractId}', '{functionName}', '{parameters.encode()}', '{accountId}', '{accountPrivateKey}', {gas})")
.UnwrapIfPromise()
.ToString();
SignedTx signedTx = this.processResponse<SignedTx>(signedTxResponse);
return await apiService.executeTx(signedTx.tx, signedTx.network);
}
}Method to call smart-contract query
Parameters:
contractId: contract idfunctionName: contract function nameparams: function arguments (instance of ContractFunctionParameters)accountId: sender account idaccountPrivateKey: sender's private key to sign transfer transactiongas: gas amount for transaction (default 100000)bladePayFee: blade pay fee, otherwise fee will be pay from sender accountIdreturnTypes: array of return types, e.g. ["string", "int32"]
Returns:
an instance of
ContractQueryDatacontaining result from query with types
public async Task<ContractQueryData> contractCallQueryFunction(
string contractId,
string functionName,
ContractFunctionParameters parameters,
string accountId,
string accountPrivateKey,
uint gas,
uint fee,
List<string> returnTypes
) {
if (fee > 0) {
string nodeAccountId = "0.0.3";
string delayedQueryCallResponse = engine
.Evaluate($"window.bladeSdk.contractCallQueryFunction('{contractId}', '{functionName}', '{parameters.encode()}', '{accountId}', '{accountPrivateKey}', {gas}, {fee}, '{nodeAccountId}')")
.UnwrapIfPromise()
.ToString();
DelayedQueryCall delayedQueryCall = this.processResponse<DelayedQueryCall>(delayedQueryCallResponse);
DelayedQueryCallResult delayedQueryCallResult = await apiService.executeDelayedQueryCall(delayedQueryCall);
string contractCallQueryResponse = engine
.Evaluate($"window.bladeSdk.parseContractCallQueryResponse('{contractId}', '{delayedQueryCallResult.contractFunctionResult.gasUsed}', '{delayedQueryCallResult.rawResult}', ['{string.Join("', '", returnTypes)}'])")
.UnwrapIfPromise()
.ToString();
ContractQueryData contractQueryData = this.processResponse<ContractQueryData>(contractCallQueryResponse);
return contractQueryData;
} else {
// blade pay fee
throw new BladeSDKException("Error", "free queries not implemented yet");
}
}Method to get C14 url for payment
Parameters:
asset: USDC, HBAR, KARATE or C14 asset uuidaccount: receiver account idamount: amount to buy
Returns:
string with C14 url with preseted paramsbalances.
public async Task<string> getC14url(
string asset,
string account,
string amount
) {
string tvteToken = this.getTvteToken();
string clientId = await apiService.getC14token(tvteToken);
var purchaseParams = new Dictionary<string, object> {
{ "clientId", clientId }
};
switch (asset.ToUpper()) {
case "USDC":
purchaseParams["targetAssetId"] = "b0694345-1eb4-4bc4-b340-f389a58ee4f3";
purchaseParams["targetAssetIdLock"] = "true";
break;
case "HBAR":
purchaseParams["targetAssetId"] = "d9b45743-e712-4088-8a31-65ee6f371022";
purchaseParams["targetAssetIdLock"] = "true";
break;
case "KARATE":
purchaseParams["targetAssetId"] = "057d6b35-1af5-4827-bee2-c12842faa49e";
purchaseParams["targetAssetIdLock"] = "true";
break;
default:
if (asset.Split('-').Length == 5) {
purchaseParams["targetAssetId"] = asset;
purchaseParams["targetAssetIdLock"] = "true";
}
break;
}
if (!string.IsNullOrEmpty(amount)) {
purchaseParams["sourceAmount"] = amount;
purchaseParams["quoteAmountLock"] = "true";
}
if (!string.IsNullOrEmpty(account)) {
purchaseParams["targetAddress"] = account;
purchaseParams["targetAddressLock"] = "true";
}
string queryString = "";
foreach (var kv in purchaseParams) {
queryString = queryString + $"{HttpUtility.UrlEncode(kv.Key)}={HttpUtility.UrlEncode(kv.Value.ToString())}&";
}
var uriBuilder = new UriBuilder("https://pay.c14.money/");
uriBuilder.Query = queryString.ToString();
return uriBuilder.Uri.ToString();
}Sign message with private key
Parameters:
messageEncoded: encoder message stringaccountPrivateKey: private key stringencoding: message encoding. One of: hex, base64, utf8
Returns:
an instance of
SignMessageDatacontaining signature
public async Task<SignMessageData> sign(
string messageEncoded,
string accountPrivateKey,
string encoding // hex|base64|utf8
) {
string signMessageReponse = engine
.Evaluate($"window.bladeSdk.sign('{messageEncoded}', '{accountPrivateKey}', '{encoding}')")
.UnwrapIfPromise()
.ToString();
SignMessageData signMessageData = this.processResponse<SignMessageData>(signMessageReponse);
return signMessageData;
}Verify message signature with public key
Parameters:
messageEncoded: message encodedsignatureHex: hex-encoded signature stringpublicKey: public key stringencoding: message encoding. One of: hex, base64, utf8
Returns:
boolean. True if signature is valid
public async Task<bool> signVerify(
string messageEncoded,
string signatureHex,
string publicKey, // hex-encoded public key with DER header
string encoding // hex|base64|utf8
) {
string signVerifyMessageResponse = engine
.Evaluate($"window.bladeSdk.signVerify('{messageEncoded}', '{signatureHex}', '{publicKey}', '{encoding}')")
.UnwrapIfPromise()
.ToString();
SignVerifyMessageData signVerifyMessageData = this.processResponse<SignVerifyMessageData>(signVerifyMessageResponse);
return signVerifyMessageData.valid;
}Sign message with private key (hethers lib)
Parameters:
messageEncoded: encoder message stringaccountPrivateKey: private key stringencoding: message encoding. One of: hex, base64, utf8
Returns:
an instance of
SignMessageDatacontaining signature
public async Task<SignMessageData> hethersSign(
string messageEncoded,
string accountPrivateKey,
string encoding // hex|base64|utf8
) {
string signMessageReponse = engine
.Evaluate($"window.bladeSdk.hethersSign('{messageEncoded}', '{accountPrivateKey}', '{encoding}')")
.UnwrapIfPromise()
.ToString();
SignMessageData signMessageData = this.processResponse<SignMessageData>(signMessageReponse);
return signMessageData;
}Method to split signature into v-r-s
Parameters:
signature: signature string "0x21fbf0696......"
Returns:
an instance of
SplitSignatureDatacontaining v, r, s
public async Task<SplitSignatureData> splitSignature(string signature) {
string splitSignatureResponse = engine
.Evaluate($"window.bladeSdk.splitSignature('{signature}')")
.UnwrapIfPromise()
.ToString();
SplitSignatureData splitSignatureData = this.processResponse<SplitSignatureData>(splitSignatureResponse);
return splitSignatureData;
}Get signature for contract params into v-r-s
Parameters:
params: function arguments (instance of ContractFunctionParameters)accountPrivateKey: account private key string
Returns:
an instance of
SplitSignatureDatacontaining v, r, s
public async Task<SplitSignatureData> getParamsSignature(
ContractFunctionParameters parameters,
string accountPrivateKey
) {
string splitSignatureResponse = engine
.Evaluate($"window.bladeSdk.getParamsSignature('{parameters.encode()}', '{accountPrivateKey}')")
.UnwrapIfPromise()
.ToString();
SplitSignatureData splitSignatureData = this.processResponse<SplitSignatureData>(splitSignatureResponse);
return splitSignatureData;
}Method to get transactions history
Parameters:
accountId: accountId of historytransactionType: filter by type of transactionnextPage: link from response to load next page of historytransactionsLimit: limit of transactions to load
Returns:
an instance of
TransactionsHistoryDatacontaining transaction records, filtered and aggregated
public async Task<TransactionsHistoryData> getTransactions(string accountId, string transactionType, string nextPage, int transactionsLimit) {
TransactionsHistoryData transactionsHistoryData = await apiService.getTransactionsFrom(accountId, transactionType, nextPage, transactionsLimit);
return transactionsHistoryData;
}
Last updated