diff --git a/.changeset/breezy-squids-hug.md b/.changeset/breezy-squids-hug.md new file mode 100644 index 0000000..2fa1b2f --- /dev/null +++ b/.changeset/breezy-squids-hug.md @@ -0,0 +1,6 @@ +--- +"@bitfinity-network/bridge": minor +"@bitfinity-network/bridge-widget": minor +--- + +Make envs optional diff --git a/packages/bridge/src/constants.ts b/packages/bridge/src/constants.ts index d83b9bf..aade97e 100644 --- a/packages/bridge/src/constants.ts +++ b/packages/bridge/src/constants.ts @@ -12,28 +12,32 @@ export const IC_HOST = str.parse( process.env.IC_HOST || 'http://127.0.0.1:4943' ); -export const FEE_CHARGE_ADDRESS = str.parse(process.env.FEE_CHARGE_ADDRESS); +export const FEE_CHARGE_ADDRESS = str + .optional() + .parse(process.env.FEE_CHARGE_ADDRESS); -export const ICRC2_MINTER_CANISTER_ID = str.parse( - process.env.ICRC2_MINTER_CANISTER_ID -); +export const ICRC2_MINTER_CANISTER_ID = str + .optional() + .parse(process.env.ICRC2_MINTER_CANISTER_ID); -export const ICRC2_TOKEN_CANISTER_ID = str.parse( - process.env.ICRC2_TOKEN_CANISTER_ID -); +export const ICRC2_TOKEN_CANISTER_ID = str + .optional() + .parse(process.env.ICRC2_TOKEN_CANISTER_ID); -export const BTC_BRIDGE_CANISTER_ID = str.parse( - process.env.BTC_BRIDGE_CANISTER_ID -); +export const BTC_BRIDGE_CANISTER_ID = str + .optional() + .parse(process.env.BTC_BRIDGE_CANISTER_ID); -export const RUNE_BRIDGE_CANISTER_ID = str.parse( - process.env.RUNE_BRIDGE_CANISTER_ID -); +export const RUNE_BRIDGE_CANISTER_ID = str + .optional() + .parse(process.env.RUNE_BRIDGE_CANISTER_ID); -export const RUNE_TOKEN_ID = str.parse(process.env.RUNE_TOKEN_ID); +export const RUNE_TOKEN_ID = str.optional().parse(process.env.RUNE_TOKEN_ID); -export const BFT_ETH_ADDRESS = str.parse(process.env.BFT_ETH_ADDRESS); +export const BFT_ETH_ADDRESS = str + .optional() + .parse(process.env.BFT_ETH_ADDRESS); -export const BTC_TOKEN_WRAPPED_ADDRESS = str.parse( - process.env.BTC_TOKEN_WRAPPED_ADDRESS -); +export const BTC_TOKEN_WRAPPED_ADDRESS = str + .optional() + .parse(process.env.BTC_TOKEN_WRAPPED_ADDRESS); diff --git a/packages/bridge/src/tests/btc.test.ts b/packages/bridge/src/tests/btc.test.ts deleted file mode 100644 index ac00ca9..0000000 --- a/packages/bridge/src/tests/btc.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { describe, expect, test } from 'vitest'; - -import { BTC_TOKEN_WRAPPED_ADDRESS, Connector } from '..'; -import { - randomWallet, - mintNativeToken, - execBitcoinCmd, - createAnnonAgent -} from './utils'; -import { wait } from '../utils'; - -describe.sequential( - 'btc', - async () => { - const wallet = randomWallet(); - - const { agent } = createAnnonAgent(); - - await mintNativeToken(wallet.address, '10000000000000000'); - await wait(1000); - - const connector = Connector.create({ agent }); - - connector.connectEthWallet(wallet); - - await connector.fetchLocal(); - await connector.bridge(); - - const btcBridge = connector.getBridge<'btc'>(BTC_TOKEN_WRAPPED_ADDRESS); - - test('get balance', async () => { - const wrappedBalance = await btcBridge.getWrappedTokenBalance( - wallet.address - ); - - expect(wrappedBalance).toStrictEqual(0n); - }); - - test('bridge to evm', async () => { - const btcAddress = await btcBridge.getBTCAddress(wallet.address); - - await execBitcoinCmd( - `sendtoaddress "${btcAddress}" ${bitcore.Unit.fromSatoshis(1000000000).toBTC()}` - ); - await execBitcoinCmd( - `generatetoaddress 1 "bcrt1quv0zt5ep4ksx8l2tgtgpfd7fsz6grr0wek3rg7"` - ); - await wait(10000); - - await btcBridge.bridgeToEvmc(wallet.address); - - await wait(5000); - - const wrappedBalance = await btcBridge.getWrappedTokenBalance( - wallet.address - ); - - expect(wrappedBalance).toStrictEqual(999998990n); - }); - - test('bridge from evm', async () => { - const address = (await execBitcoinCmd('getnewaddress')).trim(); - - await btcBridge.bridgeFromEvmc(address, 100000000); - - await execBitcoinCmd( - `generatetoaddress 1 "bcrt1quv0zt5ep4ksx8l2tgtgpfd7fsz6grr0wek3rg7"` - ); - - await wait(5000); - - const wrappedBalance = await btcBridge.getWrappedTokenBalance( - wallet.address - ); - expect(wrappedBalance).toStrictEqual(899998990n); - }); - }, - 180000 -); diff --git a/packages/bridge/src/tests/icrc2.test.ts b/packages/bridge/src/tests/icrc2.test.ts new file mode 100644 index 0000000..8b0f4b8 --- /dev/null +++ b/packages/bridge/src/tests/icrc2.test.ts @@ -0,0 +1,100 @@ +import { describe, expect, test } from 'vitest'; + +import { Connector, ICRC2_TOKEN_CANISTER_ID } from '../'; +import { + createAgent, + createBitfinityWallet, + execSendIcrcToken, + mintNativeToken, + randomWallet, + testNetwork +} from './utils'; +import { wait } from '../utils'; + +describe.sequential( + 'icrc2', + async () => { + const wallet = randomWallet(); + + const { agent, identity } = createAgent(wallet.privateKey); + const bitfinityWallet = createBitfinityWallet(agent); + + await mintNativeToken(wallet.address, '1000000000000000000'); + await execSendIcrcToken(identity.getPrincipal().toText(), 100000000); + await wait(3000); + + const connector = Connector.create(); + + connector.connectEthWallet(wallet); + connector.connectBitfinityWallet(bitfinityWallet); + + connector.addNetwork(testNetwork); + + const icrcBricdge = connector.getBridge('devnet', 'icrc_evm'); + + test('deploy icrc2 token to evm', async () => { + const wrapped = await icrcBricdge.deployWrappedToken({ + id: ICRC2_TOKEN_CANISTER_ID, + name: 'AUX', + symbol: 'AUX' + }); + expect(wrapped).toBeTypeOf('string'); + + const balance = await icrcBricdge.getWrappedTokenBalance( + wrapped, + wallet.address + ); + expect(balance).toStrictEqual(0n); + }); + + test('bridge icrc2 token to evm', async () => { + const amount = 100000n; + + await icrcBricdge.bridgeToEvmc({ + token: ICRC2_TOKEN_CANISTER_ID, + owner: identity.getPrincipal().toText(), + recipient: wallet.address, + amount + }); + + await wait(10000); + + const wrapped = await icrcBricdge.getWrappedTokenAddress( + ICRC2_TOKEN_CANISTER_ID + ); + + const balance = await icrcBricdge.getWrappedTokenBalance( + wrapped, + wallet.address + ); + expect(balance).toStrictEqual(amount); + }); + + test('bridge evmc tokens to icrc2', async () => { + const amount = 1000n; + + const balance = await icrcBricdge.getBaseTokenBalance( + ICRC2_TOKEN_CANISTER_ID, + identity.getPrincipal().toText() + ); + expect(balance).toStrictEqual(99899980n); + + const wrapped = await icrcBricdge.getWrappedTokenAddress( + ICRC2_TOKEN_CANISTER_ID + ); + + await icrcBricdge.bridgeFromEvmc({ + wrappedToken: wrapped, + recipient: identity.getPrincipal().toText(), + amount + }); + + const balance2 = await icrcBricdge.getBaseTokenBalance( + ICRC2_TOKEN_CANISTER_ID, + identity.getPrincipal().toText() + ); + expect(balance2).toStrictEqual(99900970n); + }); + }, + 280000 +); diff --git a/packages/widget/src/utils/constants.ts b/packages/widget/src/utils/constants.ts index e8e437e..41a09f7 100644 --- a/packages/widget/src/utils/constants.ts +++ b/packages/widget/src/utils/constants.ts @@ -53,8 +53,8 @@ export const LIST_URLS: ListsUrl[] = IS_DEV } ]; -export const IC_HOST = z.string().parse(process.env.IC_HOST); -export const RPC_URL = z.string().parse(process.env.RPC_URL); +export const IC_HOST = z.string().default('http://127.0.0.1:4943').parse(process.env.IC_HOST); +export const RPC_URL = z.string().default('http://127.0.0.1:8545').parse(process.env.RPC_URL); const nativeCurrency = { name: 'Bitfinity',