diff --git a/packages/sdk/src/Sygma.ts b/packages/sdk/src/Sygma.ts index d7691a41f..f8f70fc64 100644 --- a/packages/sdk/src/Sygma.ts +++ b/packages/sdk/src/Sygma.ts @@ -620,7 +620,7 @@ export class Sygma implements SygmaSDK { fromDomainID, toDomainID, resourceID, - tokenAmount: Number(amount), + tokenAmount: amount, recipientAddress, }); @@ -665,7 +665,7 @@ export class Sygma implements SygmaSDK { fromDomainID: parseInt(this.bridgeSetup!.chain1.domainId), toDomainID: parseInt(this.bridgeSetup!.chain2.domainId), resourceID, - tokenAmount: Number(amount), + tokenAmount: amount, feeOracleBaseUrl, feeOracleHandlerAddress, overridedResourceId, // '0xbA2aE424d960c26247Dd6c32edC70B295c744C43', diff --git a/packages/sdk/src/fee/__test__/basicFee.test.ts b/packages/sdk/src/fee/__test__/basicFee.test.ts index e5dd1e67d..35292e42a 100644 --- a/packages/sdk/src/fee/__test__/basicFee.test.ts +++ b/packages/sdk/src/fee/__test__/basicFee.test.ts @@ -27,7 +27,7 @@ describe('CalculateBasicFee', () => { fromDomainID: '1', toDomainID: '2', resourceID: '0x0000000000000000000000000000000000000000000000000000000000000000', - tokenAmount: 100, + tokenAmount: "0.001", recipientAddress: '0xF4314cb9046bECe6AA54bb9533155434d0c76909', }); @@ -54,7 +54,7 @@ describe('CalculateBasicFee', () => { fromDomainID: '1', toDomainID: '2', resourceID: '0x0000000000000000000000000000000000000000000000000000000000000000', - tokenAmount: 100, + tokenAmount: "100", recipientAddress: '0xF4314cb9046bECe6AA54bb9533155434d0c76909', }); } catch (e) { diff --git a/packages/sdk/src/fee/__test__/feeOracle.test.ts b/packages/sdk/src/fee/__test__/feeOracle.test.ts index 451bb3aa9..ca178f1b7 100644 --- a/packages/sdk/src/fee/__test__/feeOracle.test.ts +++ b/packages/sdk/src/fee/__test__/feeOracle.test.ts @@ -71,16 +71,33 @@ describe('feeOracle', () => { }); } catch (e) { // @ts-ignore - expect(e.message).toMatch('Invalid fee oracle response'); + expect(e.message).toMatch('Internal Error'); } }); + + it('return error message from fee oracle server', async () => { + (fetch as jest.MockedFunction).mockResolvedValue( + new Response(JSON.stringify({error: 'sick'}), { + url: 'url', + status: 200, + statusText: 'OK' + }), + ); + await expect( + requestFeeFromFeeOracle({ + feeOracleBaseUrl: 'http://localhost:8091', + fromDomainID: 1, + toDomainID: 2, + resourceID: '0x0000000000000000000000000000000000000000000000000000000000000001', + })).rejects.toThrowError("sick"); + }); }); describe('createOracleFeeData', () => { it('builds feeData', () => { const feeData = createOracleFeeData( oracleResponse.response, - 10, + "10", '0x0000000000000000000000000000000000000000000000000000000000000001', '0x6937d1d0b52f2fa7f4e071c7e64934ad988a8f21c6bf4f323fc19af4c77e3c5e', ); @@ -104,7 +121,7 @@ describe('feeOracle', () => { fromDomainID: 1, toDomainID: 2, resourceID: '0x0000000000000000000000000000000000000000000000000000000000000001', - tokenAmount: 100, + tokenAmount: "100", feeOracleBaseUrl: 'http://localhost:8091', feeOracleHandlerAddress: '0xa9ddD97e1762920679f3C20ec779D79a81903c0B', overridedResourceId: '0xbA2aE424d960c26247Dd6c32edC70B295c744C43', @@ -118,6 +135,32 @@ describe('feeOracle', () => { }); }); + it('get the fee data with no oracle key', async () => { + (fetch as jest.MockedFunction).mockResolvedValue( + new Response(JSON.stringify(oracleResponse), { url: 'url', status: 200, statusText: 'OK' }), + ); + + const provider = new ethers.providers.JsonRpcProvider(); + const feeData = await calculateFeeData({ + provider, + sender: ethers.constants.AddressZero, + recipientAddress: '0x74d2946319bEEe4A140068eb83F9ee3a90B06F4f', + fromDomainID: 1, + toDomainID: 2, + resourceID: '0x0000000000000000000000000000000000000000000000000000000000000001', + tokenAmount: "100", + feeOracleBaseUrl: 'http://localhost:8091', + feeOracleHandlerAddress: '0xa9ddD97e1762920679f3C20ec779D79a81903c0B', + }); + expect(feeData?.feeData).toContain(oracleResponse.response.signature) + expect(feeData).toMatchObject({ + calculatedRate: '0.00000000000000001', + erc20TokenAddress: '0x141F8690A87A7E57C2E270ee77Be94935970c035', + feeData: + '0x000000000000000000000000000000000000000000000000000194b9a2ecd000000000000000000000000000000000000000000000000000dd55bf4eab04000000000000000000000000000000000000000000000000000000000000773594000000000000000000000000000000000000000000000000000000000069b26b140000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffdd02c9aaf691e70dcbb69f9e6ec558c3e078c1ec75a5beec0ec46d452c505d3a616a5d6dc738da57ce1ffb6c16fb7f51cfbea6017fa029cd95005a8eaefef31b0000000000000000000000000000000000000000000000000000000000000064', + }); + }); + it('get error', async () => { (fetch as jest.MockedFunction).mockRejectedValue('Err'); try { @@ -129,7 +172,7 @@ describe('feeOracle', () => { fromDomainID: 1, toDomainID: 2, resourceID: '0x0000000000000000000000000000000000000000000000000000000000000001', - tokenAmount: 100, + tokenAmount: "100", feeOracleBaseUrl: 'http://localhost:8091', feeOracleHandlerAddress: '0xa9ddD97e1762920679f3C20ec779D79a81903c0B', overridedResourceId: '0xbA2aE424d960c26247Dd6c32edC70B295c744C43', diff --git a/packages/sdk/src/fee/basicFee.ts b/packages/sdk/src/fee/basicFee.ts index 73951f499..2872707a4 100644 --- a/packages/sdk/src/fee/basicFee.ts +++ b/packages/sdk/src/fee/basicFee.ts @@ -1,5 +1,5 @@ import { BasicFeeHandler__factory as BasicFeeHandler } from '@buildwithsygma/sygma-contracts'; -import { ethers } from 'ethers'; +import { ethers, utils } from 'ethers'; import { FeeDataResult } from '../types'; import { createERCDepositData } from '../utils/helpers'; @@ -25,10 +25,11 @@ export const calculateBasicfee = async ({ fromDomainID: string; toDomainID: string; resourceID: string; - tokenAmount: number; + tokenAmount: string; recipientAddress: string; }): Promise => { - const depositData = createERCDepositData(tokenAmount, 20, recipientAddress); + const convertedAmount = utils.parseUnits(tokenAmount, 18); + const depositData = createERCDepositData(convertedAmount, 20, recipientAddress); // WHY 0X00 AND NOT 0X0? const feeData = '0x00'; const BasicFeeHandlerInstance = BasicFeeHandler.connect(basicFeeHandlerAddress, provider); diff --git a/packages/sdk/src/fee/feeOracle.ts b/packages/sdk/src/fee/feeOracle.ts index 9f6ba9565..fc50f8c09 100644 --- a/packages/sdk/src/fee/feeOracle.ts +++ b/packages/sdk/src/fee/feeOracle.ts @@ -1,5 +1,5 @@ import { FeeHandlerWithOracle__factory } from '@buildwithsygma/sygma-contracts'; -import { ethers } from 'ethers'; +import { ethers, utils } from 'ethers'; import fetch from 'node-fetch'; import EthCrypto from 'eth-crypto'; @@ -22,7 +22,7 @@ type OracleResponse = { */ export const createOracleFeeData = ( oracleResponse: OracleResource, - amount: number, + amount: string, tokenResource: string, oraclePrivateKey?: string, ): string => { @@ -70,7 +70,7 @@ export const createOracleFeeData = ( return oracleMessage + signature.substring(2) + toHex(amount, 32).substring(2); } else { signature = oracleResponse.signature; - return oracleMessage + signature + toHex(0, 32).substring(2); + return oracleMessage + signature + toHex(amount, 32).substring(2); } }; @@ -99,13 +99,13 @@ export const calculateFeeData = async ({ fromDomainID: number; toDomainID: number; resourceID: string; - tokenAmount: number; + tokenAmount: string; feeOracleBaseUrl: string; feeOracleHandlerAddress: string; overridedResourceId?: string; oraclePrivateKey?: string; }): Promise => { - const depositData = createERCDepositData(tokenAmount, 20, recipientAddress); + const depositData = createERCDepositData(utils.parseUnits(tokenAmount, 18), 20, recipientAddress); let oracleResponse; try { oracleResponse = await requestFeeFromFeeOracle({ @@ -185,6 +185,6 @@ export const requestFeeFromFeeOracle = async ({ return data.response; } } catch (e) { - return Promise.reject(new Error('Invalid fee oracle response')); + return Promise.reject(e); } }; diff --git a/packages/sdk/src/utils/helpers.ts b/packages/sdk/src/utils/helpers.ts index a7a96dc98..01c44d0fd 100644 --- a/packages/sdk/src/utils/helpers.ts +++ b/packages/sdk/src/utils/helpers.ts @@ -8,7 +8,8 @@ import { utils, BigNumber } from 'ethers'; * @returns {string} */ export const toHex = (covertThis: string | number | BigNumber, padding: number): string => { - return utils.hexZeroPad(utils.hexlify(BigNumber.from(covertThis)), padding); + const amount = covertThis instanceof BigNumber ? covertThis : BigNumber.from(covertThis); + return utils.hexZeroPad(utils.hexlify(amount), padding); }; /**