import { ApproveErc20, ApproveNftSpending, ApproveTransferCustodialWallet, ApproveTransferCustodialWalletCelo, BroadcastKMS, BurnMultiToken, BurnMultiTokenBatch, BurnNft, BuyAssetOnMarketplace, CallCeloSmartContractMethod, CallReadSmartContractMethod, CallSmartContractMethod, CancelablePromise, CancelSellAssetOnMarketplace, ChainBurnErc20 as ApiChainBurnErc20, ChainMintErc20 as ApiChainMintErc20, ChainTransferEthErc20, DeployErc20, DeployMultiToken, DeployNft, ExchangeRate, ExchangeRateService, Fiat, GenerateCustodialWallet, GenerateCustodialWalletBatch, GenerateCustodialWalletBatchCelo, GenerateCustodialWalletBatchCeloKMS, GenerateCustodialWalletBatchKMS, GenerateCustodialWalletBatchPayer, GenerateCustodialWalletCelo, GenerateMarketplace, MarketplaceService, MintErc721, MintMultipleNft, MintMultiToken, MintMultiTokenBatch, MintNft, PendingTransaction, SellAssetOnMarketplace, SignatureId, TatumUrl, TransactionHash, TransferCustodialWallet, TransferCustodialWalletBatch, TransferCustodialWalletBatchCelo, TransferCustodialWalletCelo, TransferCustodialWalletCeloKMS, TransferCustodialWalletKMS, TransferMultiToken, TransferMultiTokenBatch, TransferNft, TransferPolygonBlockchain, UpdateCashbackValueForAuthorNft, UpdateFee, UpdateFeeRecipient, XlmWallet, XrpWallet, } from '@tatumio/api-client' import { Blockchain, blockchainHelper } from '@tatumio/shared-core' import { abstractSdk, WithoutChain } from '@tatumio/shared-abstract-sdk' import { abstractBlockchainKms } from './services/kms.abstract-blockchain' import { abstractBlockchainOffchain } from './services/offchain.abstract-blockchain' export const abstractBlockchainSdk = (args: { apiKey: string; url?: TatumUrl; blockchain: Blockchain }) => { return { ...abstractSdk(args), kms: abstractBlockchainKms(args), offchain: abstractBlockchainOffchain(args), getExchangeRate(basePair?: Fiat): CancelablePromise { return ExchangeRateService.getExchangeRate( // @ts-ignore @TODO OPENAPI fix blockchainHelper.getDefaultCurrencyByBlockchain(blockchain), basePair, ) }, } } export interface SdkWithXrpLikeWalletFunction { wallet(): XrpWallet | XlmWallet } export type FromSecretOrSignatureId = Omit & Partial & Partial> export type SecretOrSignatureId = Omit & Partial & Partial> export type FromPrivateKeyOrSignatureId = Omit & Partial & Partial> export type ChainTransferErc20 = FromPrivateKeyOrSignatureId> export type ChainMintErc20 = FromPrivateKeyOrSignatureId> export type ChainBurnErc20 = FromPrivateKeyOrSignatureId> export type ChainApproveErc20 = FromPrivateKeyOrSignatureId export type ChainDeployErc20 = FromPrivateKeyOrSignatureId export type ChainMintErc721 = MintErc721 & { fromPrivateKey?: string minter?: string chain: 'ETH' | 'MATIC' | 'KCS' | 'ONE' | 'BSC' | 'KLAY' } export type ChainMintNft = FromPrivateKeyOrSignatureId export type ChainMintMultipleNft = FromPrivateKeyOrSignatureId & { erc20?: string } export type ChainBurnErc721 = FromPrivateKeyOrSignatureId export type ChainTransferErc721 = FromPrivateKeyOrSignatureId export type ChainUpdateCashbackErc721 = FromPrivateKeyOrSignatureId export type ChainDeployErc721 = FromPrivateKeyOrSignatureId export type ChainBurnMultiToken = FromPrivateKeyOrSignatureId export type ChainBurnMultiTokenBatch = FromPrivateKeyOrSignatureId export type ChainTransferMultiToken = FromPrivateKeyOrSignatureId export type ChainTransferMultiTokenBatch = FromPrivateKeyOrSignatureId export type ChainMintMultiToken = FromPrivateKeyOrSignatureId export type ChainMintMultiTokenBatch = FromPrivateKeyOrSignatureId export type ChainDeployMultiToken = FromPrivateKeyOrSignatureId export type ChainSmartContractMethodInvocation = FromPrivateKeyOrSignatureId & { index?: number } export type ChainGenerateCustodialAddress = | FromPrivateKeyOrSignatureId | FromPrivateKeyOrSignatureId export type ChainTransferNative = FromPrivateKeyOrSignatureId> & { gas?: string } export type ChainGenerateMarketplace = FromPrivateKeyOrSignatureId export type ChainUpdateFee = FromPrivateKeyOrSignatureId export type ChainUpdateFeeRecipient = FromPrivateKeyOrSignatureId export type ChainBuyAssetOnMarketplace = FromPrivateKeyOrSignatureId export type ChainSellAssetOnMarketplace = FromPrivateKeyOrSignatureId export type ChainCancelSellAssetOnMarketplace = FromPrivateKeyOrSignatureId export type ChainTransferCustodialWallet = | (FromPrivateKeyOrSignatureId & { index?: number }) | (FromPrivateKeyOrSignatureId & { index?: number }) export type ChainBatchTransferCustodialWallet = | (FromPrivateKeyOrSignatureId & { index?: number }) | (FromPrivateKeyOrSignatureId & { index?: number }) export type ChainApproveCustodialTransfer = | (FromPrivateKeyOrSignatureId & { index?: number }) | (FromPrivateKeyOrSignatureId & { index?: number }) export type ChainTransferFromCustodialAddress = | TransferCustodialWalletKMS | TransferCustodialWallet | TransferCustodialWalletCelo | TransferCustodialWalletCeloKMS export type ChainGenerateCustodialWalletBatch = | GenerateCustodialWalletBatchPayer | GenerateCustodialWalletBatch | GenerateCustodialWalletBatchKMS | GenerateCustodialWalletBatchCelo | GenerateCustodialWalletBatchCeloKMS export type ChainCallSmartContractMethod = | (FromPrivateKeyOrSignatureId & { index?: number }) | (FromPrivateKeyOrSignatureId & { index?: number chain: 'CELO' }) export type ChainTransferCustodialWalletCelo = FromPrivateKeyOrSignatureId & { index?: number } export interface SdkWithErc20Functions { decimals(contractAddress: string, provider?: string): any prepare: { deploySignedTransaction(body: ChainDeployErc20, provider?: string): Promise transferSignedTransaction(body: ChainTransferErc20, provider?: string): Promise mintSignedTransaction(body: ChainMintErc20, provider?: string): Promise burnSignedTransaction(body: ChainBurnErc20, provider?: string): Promise } } export interface SdkWithNativeFunctions { prepare: { transferSignedTransaction(body: ChainTransferNative, provider?: string): Promise } } export interface SdkWithErc721Functions { prepare: { deploySignedTransaction(body: ChainDeployErc721, provider?: string): Promise transferSignedTransaction(body: ChainTransferErc721, provider?: string): Promise mintSignedTransaction(body: ChainMintErc721, provider?: string): Promise burnSignedTransaction(body: ChainBurnErc721, provider?: string): Promise mintMultipleSignedTransaction(body: ChainMintMultipleNft, provider?: string): Promise mintCashbackSignedTransaction(body: ChainMintNft, provider?: string): Promise mintMultipleCashbackSignedTransaction(body: ChainMintMultipleNft, provider?: string): Promise updateCashbackForAuthorSignedTransaction( body: ChainUpdateCashbackErc721, provider?: string, ): Promise mintProvenanceSignedTransaction(body: ChainMintNft, provider?: string): Promise mintMultipleProvenanceSignedTransaction( body: ChainMintMultipleNft & { fixedValues: string[][] }, provider?: string, ): Promise } } export interface SdkWithMultiTokenFunctions { prepare: { mintMultiTokenTransaction(body: ChainMintMultiToken, provider?: string): Promise mintMultiTokenBatchTransaction(body: ChainMintMultiTokenBatch, provider?: string): Promise transferMultiTokenTransaction(body: ChainTransferMultiToken, provider?: string): Promise transferMultiTokenBatchTransaction(body: ChainTransferMultiTokenBatch, provider?: string): Promise deployMultiTokenTransaction(body: ChainDeployMultiToken, provider?: string): Promise burnMultiTokenTransaction(body: ChainBurnMultiToken, provider?: string): Promise burnMultiTokenBatchTransaction(body: ChainBurnMultiTokenBatch, provider?: string): Promise } } export interface SdkWithSmartContractFunctions { prepare: { smartContractWriteMethodInvocationTransaction( body: ChainSmartContractMethodInvocation, provider?: string, ): Promise } send: { smartContractReadMethodInvocationTransaction( body: CallReadSmartContractMethod, provider?: string, ): Promise<{ data: any }> } } export interface SdkWithCustodialFunctions { prepare: { transferFromCustodialWallet( body: ChainTransferCustodialWallet, provider?: string, testnet?: boolean, ): Promise batchTransferFromCustodialWallet: ( body: ChainBatchTransferCustodialWallet, provider?: string, testnet?: boolean, ) => Promise approveFromCustodialWallet: (body: ChainApproveCustodialTransfer, provider?: string) => Promise custodialWalletBatch: ( body: ChainGenerateCustodialWalletBatch, provider?: string, testnet?: boolean, ) => Promise } } export interface SdkWithMarketplaceFunctions { prepare: { approveErc20Spending(body: ApproveErc20, provider?: string): Promise approveSpending( body: FromPrivateKeyOrSignatureId> & { amount: string }, provider?: string, ): Promise generateMarketplace(body: ChainGenerateMarketplace, provider?: string): Promise updateFee(body: ChainUpdateFee, provider?: string): Promise updateFeeRecipient(body: ChainUpdateFeeRecipient, provider?: string): Promise buyMarketplaceListing(body: ChainBuyAssetOnMarketplace, provider?: string): Promise sellMarketplaceListing(body: ChainSellAssetOnMarketplace, provider?: string): Promise cancelMarketplaceListing(body: ChainCancelSellAssetOnMarketplace, provider?: string): Promise } getMarketplaceListing: typeof MarketplaceService.getMarketplaceListing getMarketplaceListings: typeof MarketplaceService.getMarketplaceListings getMarketplaceFee: typeof MarketplaceService.getMarketplaceFee getMarketplaceFeeRecipient: typeof MarketplaceService.getMarketplaceFeeRecipient } export interface SdkWithKmsFunctions { sign(tx: PendingTransaction, fromPrivateKey: string, provider?: string): Promise getAllPending(signatures?: string): CancelablePromise get(id: string): CancelablePromise } export type BroadcastFunction = (requestBody: BroadcastKMS) => CancelablePromise