Skip to content

Commit

Permalink
Feat/thorswap swap btc (#85)
Browse files Browse the repository at this point in the history
* feat(thorswap-swap-btc): add thorswap swap support

* feat(thorswap-swap): add eth evm calldata

* feat(thorswap-swap): fix test

* feat(thorswap-swap): remove merge error
  • Loading branch information
lpaquet-ledger authored Oct 2, 2024
1 parent e2639cb commit f7a67f3
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 8 deletions.
4 changes: 4 additions & 0 deletions lib/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export type SwapPayloadResponse = {
payinAddress: string;
swapId: string;
payinExtraId?: string;
extraTransactionParameters?: string,
};

export async function retrieveSwapPayload(
Expand Down Expand Up @@ -139,6 +140,7 @@ type SwapBackendResponse = {
binaryPayload: string;
signature: string;
payinExtraId?: string;
extraTransactionParameters?: string;
};

function parseSwapBackendInfo(response: SwapBackendResponse): {
Expand All @@ -147,13 +149,15 @@ function parseSwapBackendInfo(response: SwapBackendResponse): {
payinAddress: string;
swapId: string;
payinExtraId?: string;
extraTransactionParameters?: string;
} {
return {
binaryPayload: response.binaryPayload,
signature: response.signature,
payinAddress: response.payinAddress,
swapId: response.swapId,
payinExtraId: response.payinExtraId,
extraTransactionParameters: response.extraTransactionParameters,
};
}

Expand Down
10 changes: 5 additions & 5 deletions lib/src/sdk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
} from "./api";
import { ExchangeSDK, FeeStrategy } from "./sdk";
import { getCustomModule } from "./wallet-api";
import { CompleteExchangeError, PayinExtraIdError } from "./error";
import { CompleteExchangeError, PayinExtraIdError, SignatureStepError } from "./error";

jest.mock("./api");

Expand Down Expand Up @@ -197,23 +197,23 @@ describe("swap", () => {
};

mockCompleteSwap.mockRejectedValueOnce(
new CompleteExchangeError("SIGN_COIN_TRANSACTION", "error message")
new SignatureStepError(new CompleteExchangeError("SIGN_COIN_TRANSACTION", "error message"))
);

// WHEN
await expect(sdk.swap(swapData)).rejects.toThrowError();
await expect(sdk.swap(swapData)).rejects.toThrow(SignatureStepError);

// THEN
expect(cancelSwap as jest.Mock).toHaveBeenCalledWith({
provider: "provider-id",
swapId: "swap-id",
statusCode: "CompleteExchangeError",
statusCode: "SignatureStepError",
errorMessage: "error message",
sourceCurrencyId: "currency-id-1",
targetCurrencyId: "currency-id-2",
hardwareWalletType: "nanoX",
swapType: "fixed",
swapStep: "SIGN_COIN_TRANSACTION",
swapStep: "UNKNOWN_STEP",
});
});
});
Expand Down
4 changes: 2 additions & 2 deletions lib/src/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ export class ExchangeSDK {

// Step 2: Ask for payload creation
const payloadRequest = getSwapPayload ?? retrieveSwapPayload;
const { binaryPayload, signature, payinAddress, swapId, payinExtraId } =
const { binaryPayload, signature, payinAddress, swapId, payinExtraId, extraTransactionParameters } =
await payloadRequest({
provider: this.providerId,
deviceTransactionId,
Expand All @@ -231,6 +231,7 @@ export class ExchangeSDK {
currency: fromCurrency,
customFeeConfig,
payinExtraId,
extraTransactionParameters,
})
.catch(async (error) => {
await this.cancelSwapOnError(
Expand All @@ -246,7 +247,6 @@ export class ExchangeSDK {
this.handleError(error);
throw error;
});

const tx = await this.exchangeModule
.completeSwap({
provider: this.providerId,
Expand Down
41 changes: 40 additions & 1 deletion lib/src/wallet-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type TransactionWithCustomFee = TransactionCommon & {
[key: string]: BigNumber;
};
payinExtraId?: string;
extraTransactionParameters?: string;
};

// Define a specific type for the strategy functions, assuming they might need parameters
Expand All @@ -40,7 +41,7 @@ const transactionStrategy: {
[K in Transaction["family"]]: TransactionStrategyFunction;
} = {
algorand: defaultTransaction,
bitcoin: defaultTransaction,
bitcoin: bitcoinTransaction,
cardano: modeSendTransaction,
celo: defaultTransaction,
cosmos: defaultTransaction,
Expand Down Expand Up @@ -72,6 +73,7 @@ export type CreateTransactionArg = {
[key: string]: BigNumber;
};
payinExtraId?: string;
extraTransactionParameters?: string;
};

export type WalletApiDecorator = {
Expand Down Expand Up @@ -124,6 +126,7 @@ async function createTransaction({
currency,
customFeeConfig,
payinExtraId,
extraTransactionParameters,
}: CreateTransactionArg): Promise<Transaction> {
let family: Transaction["family"];
if (currency.type === "TokenCurrency") {
Expand Down Expand Up @@ -152,6 +155,7 @@ async function createTransaction({
recipient,
customFeeConfig,
payinExtraId,
extraTransactionParameters,
});
}

Expand Down Expand Up @@ -231,11 +235,46 @@ export function withoutGasLimitTransaction({
amount,
recipient,
customFeeConfig,
extraTransactionParameters,
}: TransactionWithCustomFee): Transaction {
delete customFeeConfig.gasLimit;
if (extraTransactionParameters) {
return {
family,
amount,
recipient,
...customFeeConfig,
data: Buffer.from(extraTransactionParameters, "hex"),
} as Transaction;
}
return defaultTransaction({ family, amount, recipient, customFeeConfig });
}

export function bitcoinTransaction({
family,
amount,
recipient,
customFeeConfig,
extraTransactionParameters
}: TransactionWithCustomFee): Transaction {
if (extraTransactionParameters)
{
return {
family,
amount,
recipient,
...customFeeConfig,
opReturnData: Buffer.from(extraTransactionParameters, "utf-8"),
} as Transaction;
}
return {
family,
amount,
recipient,
...customFeeConfig,
} as Transaction;
}

export function solanaTransaction({
family,
amount,
Expand Down

0 comments on commit f7a67f3

Please sign in to comment.