diff --git a/packages/cardano-services-client/src/HandleProvider/KoraLabsHandleProvider.ts b/packages/cardano-services-client/src/HandleProvider/KoraLabsHandleProvider.ts index 762491d60d7..d308e9de9ac 100644 --- a/packages/cardano-services-client/src/HandleProvider/KoraLabsHandleProvider.ts +++ b/packages/cardano-services-client/src/HandleProvider/KoraLabsHandleProvider.ts @@ -26,21 +26,23 @@ export interface KoraLabsHandleProviderDeps { policyId: Cardano.PolicyId; } -export const toHandleResolution = ({ - apiResponse, - policyId -}: { - apiResponse: IHandle; - policyId: Cardano.PolicyId; -}): HandleResolution => ({ - backgroundImage: apiResponse.bg_image ? Asset.Uri(apiResponse.bg_image) : undefined, - cardanoAddress: Cardano.PaymentAddress(apiResponse.resolved_addresses.ada), - handle: apiResponse.name, - hasDatum: apiResponse.has_datum, - image: apiResponse.image ? Asset.Uri(apiResponse.image) : undefined, - policyId, - profilePic: apiResponse.pfp_image ? Asset.Uri(apiResponse.pfp_image) : undefined -}); +export const toHandleResolution = ({ apiResponse, policyId }: { apiResponse: IHandle; policyId: Cardano.PolicyId }) => { + const cardano = Cardano.PaymentAddress(apiResponse.resolved_addresses.ada); + const result: HandleResolution = { + addresses: { cardano }, + backgroundImage: apiResponse.bg_image ? Asset.Uri(apiResponse.bg_image) : undefined, + cardanoAddress: cardano, + handle: apiResponse.name, + hasDatum: apiResponse.has_datum, + image: apiResponse.image ? Asset.Uri(apiResponse.image) : undefined, + policyId, + profilePic: apiResponse.pfp_image ? Asset.Uri(apiResponse.pfp_image) : undefined + }; + + if ('btc' in apiResponse.resolved_addresses) result.addresses.bitcoin = apiResponse.resolved_addresses.btc; + + return result; +}; /** * Creates a KoraLabs Provider instance to resolve Standard Handles diff --git a/packages/cardano-services-client/test/util.ts b/packages/cardano-services-client/test/util.ts index 5133c108568..1565f4ed399 100644 --- a/packages/cardano-services-client/test/util.ts +++ b/packages/cardano-services-client/test/util.ts @@ -40,10 +40,12 @@ export const getWrongHandleProviderResponse = { } }; +const aliceCardanoAddress = + 'addr_test1qqk4sr4f7vtqzd2w90d5nfu3n59jhhpawyphnek2y7er02nkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuqmcnecd'; export const getAliceHandleProviderResponse = { + addresses: { cardano: aliceCardanoAddress }, backgroundImage: undefined, - cardanoAddress: - 'addr_test1qqk4sr4f7vtqzd2w90d5nfu3n59jhhpawyphnek2y7er02nkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuqmcnecd', + cardanoAddress: aliceCardanoAddress, handle: 'alice', hasDatum: false, image: Asset.Uri('ipfs://c8fc19c2e61bab6059bf8a466e6e754833a08a62a6c56feasd'), @@ -51,10 +53,12 @@ export const getAliceHandleProviderResponse = { profilePic: undefined }; +const bobCardanoAddress = + 'addr_test1qzrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuql9tk0g'; export const getBobHandleProviderResponse = { + addresses: { bitcoin: 'test_bitcoin_address', cardano: bobCardanoAddress }, backgroundImage: Asset.Uri('ipfs://zrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3yd'), - cardanoAddress: - 'addr_test1qzrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuql9tk0g', + cardanoAddress: bobCardanoAddress, handle: 'bob', hasDatum: false, image: Asset.Uri('ipfs://c8fc19c2e61bab6059bf8a466e6e754833a08a62a6c56fe'), @@ -99,7 +103,8 @@ export const getBobHandleAPIResponse: Partial = { pfp_image: 'ipfs://zrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3yd1', rarity: Rarity.rare, resolved_addresses: { - ada: 'addr_test1qzrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuql9tk0g' + ada: 'addr_test1qzrljm7nskakjydxlr450ktsj08zuw6aktvgfkmmyw9semrkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuql9tk0g', + btc: 'test_bitcoin_address' }, standard_image: 'ipfs://c8fc19c2e61bab6059bf8a466e6e754833a08a62a6c56feasdfasd', updated_slot_number: 22, diff --git a/packages/cardano-services/src/Handle/TypeOrmHandleProvider.ts b/packages/cardano-services/src/Handle/TypeOrmHandleProvider.ts index 6240890ef99..95d66ecbe9e 100644 --- a/packages/cardano-services/src/Handle/TypeOrmHandleProvider.ts +++ b/packages/cardano-services/src/Handle/TypeOrmHandleProvider.ts @@ -71,6 +71,7 @@ export class TypeOrmHandleProvider extends TypeormProvider implements HandleProv ]); return { + addresses: { cardano: cardanoAddress }, backgroundImage: handleMetadataEntity?.backgroundImage || undefined, cardanoAddress, defaultForPaymentCredential: defaultForPaymentCredential || undefined, diff --git a/packages/cardano-services/test/Handle/HandleHttpService.test.ts b/packages/cardano-services/test/Handle/HandleHttpService.test.ts index 165d91750a7..74ce7e815b1 100644 --- a/packages/cardano-services/test/Handle/HandleHttpService.test.ts +++ b/packages/cardano-services/test/Handle/HandleHttpService.test.ts @@ -126,13 +126,15 @@ describe('HandleHttpService', () => { }); it('valid not empty response is openApi schema compliant', async () => { + const cardanoAddress = 'test_address'; await createServer({ getPolicyIds: () => Promise.resolve(['test_policy']), healthCheck: () => Promise.resolve({ ok: true }), resolveHandles: () => Promise.resolve([ { - cardanoAddress: 'test_address', + addresses: { cardano: cardanoAddress }, + cardanoAddress, handle: 'test', hasDatum: true, policyId: 'test_policy', @@ -146,6 +148,7 @@ describe('HandleHttpService', () => { expect({ body, status }).toEqual({ body: [ { + addresses: { cardano: 'test_address' }, cardanoAddress: 'test_address', handle: 'test', hasDatum: true, diff --git a/packages/cardano-services/test/TxSubmit/NodeTxSubmitProvider.test.ts b/packages/cardano-services/test/TxSubmit/NodeTxSubmitProvider.test.ts index b8ca5187daf..56e3cb5bf45 100644 --- a/packages/cardano-services/test/TxSubmit/NodeTxSubmitProvider.test.ts +++ b/packages/cardano-services/test/TxSubmit/NodeTxSubmitProvider.test.ts @@ -13,10 +13,12 @@ import { NoCache, NodeTxSubmitProvider, NodeTxSubmitProviderProps } from '../../ import { generateRandomHexString } from '@cardano-sdk/util-dev'; import { dummyLogger as logger } from 'ts-log'; +const cardanoAddress = Cardano.PaymentAddress( + 'addr_test1qqk4sr4f7vtqzd2w90d5nfu3n59jhhpawyphnek2y7er02nkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuqmcnecd' +); const mockHandleResolution = { - cardanoAddress: Cardano.PaymentAddress( - 'addr_test1qqk4sr4f7vtqzd2w90d5nfu3n59jhhpawyphnek2y7er02nkrezryq3ydtmkg0e7e2jvzg443h0ffzfwd09wpcxy2fuqmcnecd' - ), + addresses: { cardano: cardanoAddress }, + cardanoAddress, handle: 'alice', hasDatum: false, policyId: Cardano.PolicyId('50fdcdbfa3154db86a87e4b5697ae30d272e0bbcfa8122efd3e301cb'), diff --git a/packages/core/src/Provider/HandleProvider/types.ts b/packages/core/src/Provider/HandleProvider/types.ts index 1e6a163ba31..8337559a7f0 100644 --- a/packages/core/src/Provider/HandleProvider/types.ts +++ b/packages/core/src/Provider/HandleProvider/types.ts @@ -10,8 +10,13 @@ export type Handle = string; * @param resolvedAt the point at which the Handle was resolved */ export interface HandleResolution { + addresses: { + bitcoin?: string; + cardano: Cardano.PaymentAddress; + }; policyId: Cardano.PolicyId; handle: Handle; + /** @deprecated Use `addresses.cardano` instead. */ cardanoAddress: Cardano.PaymentAddress; hasDatum: boolean; defaultForStakeCredential?: Handle; diff --git a/packages/tx-construction/test/tx-builder/TxBuilder.test.ts b/packages/tx-construction/test/tx-builder/TxBuilder.test.ts index c76fdcd3e08..63f10fa2f1e 100644 --- a/packages/tx-construction/test/tx-builder/TxBuilder.test.ts +++ b/packages/tx-construction/test/tx-builder/TxBuilder.test.ts @@ -40,8 +40,10 @@ const rewardAccount2 = Cardano.RewardAccount('stake_test1up7pvfq8zn4quy45r2g5722 const rewardAccount3 = Cardano.RewardAccount('stake_test1uqehkck0lajq8gr28t9uxnuvgcqrc6070x3k9r8048z8y5gssrtvn'); const rewardAccount4 = Cardano.RewardAccount('stake_test17rphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcljw6kf'); +const cardanoAddress = Cardano.PaymentAddress('addr_test1vr8nl4u0u6fmtfnawx2rxfz95dy7m46t6dhzdftp2uha87syeufdg'); const resolvedHandle = { - cardanoAddress: Cardano.PaymentAddress('addr_test1vr8nl4u0u6fmtfnawx2rxfz95dy7m46t6dhzdftp2uha87syeufdg'), + addresses: { cardano: cardanoAddress }, + cardanoAddress, handle: 'alice', hasDatum: false, policyId: Cardano.PolicyId('b0d07d45fe9514f80213f4020e5a61241458be626841cde717cb38a7'), diff --git a/packages/wallet/src/services/HandlesTracker.ts b/packages/wallet/src/services/HandlesTracker.ts index 5fe5e15776a..ecdea07cfee 100644 --- a/packages/wallet/src/services/HandlesTracker.ts +++ b/packages/wallet/src/services/HandlesTracker.ts @@ -135,6 +135,7 @@ export const createHandlesTracker = ( } return { ...assetInfo, + addresses: { cardano: txOut.address }, cardanoAddress: txOut.address, handle: Asset.util.getAssetNameAsText(handleAssetId), hasDatum: !!txOut.datum diff --git a/packages/wallet/test/services/HandlesTracker.test.ts b/packages/wallet/test/services/HandlesTracker.test.ts index de68ba9e6d4..8c732d3bfe3 100644 --- a/packages/wallet/test/services/HandlesTracker.test.ts +++ b/packages/wallet/test/services/HandlesTracker.test.ts @@ -34,6 +34,7 @@ const handleOutput = utxo.find( )![1]; const expectedHandleInfo: HandleInfo = { + addresses: { cardano: handleOutput.address }, assetId: handleAssetId, cardanoAddress: handleOutput.address, fingerprint: handleFingerprint, @@ -64,10 +65,10 @@ const hydrateHandle = (handleInfo: HandleInfo) => const exponentialBackoffDelay = (iteration: number) => Math.pow(2, iteration) * HYDRATE_HANDLE_INITIAL_INTERVAL; -const lastInteration = HYDRATE_HANDLE_MAX_RETRIES - 1; +const lastIteration = HYDRATE_HANDLE_MAX_RETRIES - 1; const retrySyntax = (retries: number) => - Array.from({ length: retries }, (_, i) => exponentialBackoffDelay(i) - (i === lastInteration ? 2 : 1)) + Array.from({ length: retries }, (_, i) => exponentialBackoffDelay(i) - (i === lastIteration ? 2 : 1)) .map((exponentialDelay) => ` - ${exponentialDelay}ms `) .join('');