diff --git a/my-plugin/package.json b/my-plugin/package.json index a133026..24f8f8f 100644 --- a/my-plugin/package.json +++ b/my-plugin/package.json @@ -10,6 +10,7 @@ "start-local": "tsc -w" }, "dependencies": { + "@burner-wallet/exchange": "^1.1.4", "@poanet/tokenbridge-bw-exchange": "^0.0.3" }, "devDependencies": { diff --git a/my-plugin/src/abis/HomeStakeMediatorAbi.ts b/my-plugin/src/abis/HomeStakeMediatorAbi.ts new file mode 100644 index 0000000..cb5ef6d --- /dev/null +++ b/my-plugin/src/abis/HomeStakeMediatorAbi.ts @@ -0,0 +1,35 @@ +export default [ + { + constant: true, + inputs: [], + name: 'getFee', + outputs: [ + { + name: '', + type: 'uint256' + } + ], + payable: false, + stateMutability: 'view', + type: 'function' + }, + { + constant: true, + inputs: [ + { + name: '_value', + type: 'uint256' + } + ], + name: 'calculateFee', + outputs: [ + { + name: '', + type: 'uint256' + } + ], + payable: false, + stateMutability: 'view', + type: 'function' + } +] diff --git a/my-plugin/src/pairs/StakeBridge.ts b/my-plugin/src/pairs/StakeBridge.ts index c2a75b0..0826dfe 100644 --- a/my-plugin/src/pairs/StakeBridge.ts +++ b/my-plugin/src/pairs/StakeBridge.ts @@ -1,13 +1,63 @@ import { Mediator } from '@poanet/tokenbridge-bw-exchange' import { Stake, xStake } from '../index' +import BN from 'bn.js' +import { EstimateReturn, ValueTypes } from '@burner-wallet/exchange' +import HomeStakeMediatorAbi from '../abis/HomeStakeMediatorAbi' +import { fromWei, toBN } from 'web3-utils' + +// TODO set stake mediator addresses +const homeMediatorAddress = '0x' +const foreignMediatorAddress = '0x' export default class StakeBridge extends Mediator { - constructor() { + constructor({ + assetA = xStake.id, + assetABridge = homeMediatorAddress, + assetB = Stake.id, + assetBBridge = foreignMediatorAddress + }) { super({ - assetA: xStake.id, - assetABridge: '0x', // TODO set address - assetB: Stake.id, - assetBBridge: '0x' // TODO set address + assetA, + assetABridge, + assetB, + assetBBridge }) } + + async estimateAtoB(value: ValueTypes): Promise { + const web3 = this.getExchange() + .getAsset(this.assetA) + .getWeb3() + + const userAmount = this._getValue(value) + + const contract = new web3.eth.Contract(HomeStakeMediatorAbi, this.assetABridge) + const { feeAmount, feePercentage } = await this.getFee(web3, contract, userAmount) + const finalAmount = toBN(userAmount).sub(feeAmount) + const estimateInfo = feeAmount.isZero() + ? null + : `Estimation takes fee charges into consideration. Fee: ${feePercentage}%` + + return { + estimate: finalAmount.toString(), + estimateInfo + } + } + + async estimateBtoA(value: ValueTypes): Promise { + return { + estimate: this._getValue(value), + estimateInfo: null + } + } + + async getFee(web3: any, contract: any, value: any): Promise<{ feeAmount: BN; feePercentage: number }> { + const fee = toBN(await contract.methods.getFee().call()) + const feePercentage = Number(fromWei(fee, 'ether')) * 100 + const feeAmount = toBN(await contract.methods.calculateFee(value).call()) + return { + feeAmount, + feePercentage + } + } } diff --git a/test-wallet/package.json b/test-wallet/package.json index 3839a0c..6680d32 100644 --- a/test-wallet/package.json +++ b/test-wallet/package.json @@ -5,7 +5,7 @@ "dependencies": { "@burner-wallet/assets": "^1.1.10", "@burner-wallet/core": "^1.1.9", - "@burner-wallet/exchange": "^1.1.3", + "@burner-wallet/exchange": "^1.1.4", "@burner-wallet/metamask-plugin": "^1.0.1", "@burner-wallet/modern-ui": "^1.0.7", "@poanet/tokenbridge-bw-exchange": "^0.0.3", diff --git a/test-wallet/src/index.tsx b/test-wallet/src/index.tsx index e6e336a..1005f40 100644 --- a/test-wallet/src/index.tsx +++ b/test-wallet/src/index.tsx @@ -6,7 +6,8 @@ import { InfuraGateway, InjectedGateway } from '@burner-wallet/core/gateways' import ModernUI from '@burner-wallet/modern-ui' import Exchange from '@burner-wallet/exchange' import MetamaskPlugin from '@burner-wallet/metamask-plugin' -import { ERC677Asset, Mediator, TokenBridgeGateway } from '@poanet/tokenbridge-bw-exchange' +import { ERC677Asset, TokenBridgeGateway } from '@poanet/tokenbridge-bw-exchange' +import { StakeBridge } from 'my-plugin' const sStake = new ERC677Asset({ id: 'assetAtHome', @@ -28,7 +29,7 @@ const kStake = new ERC677Asset({ address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS }) -const StakeBridgePair = new Mediator({ +const StakeBridgePair = new StakeBridge({ assetA: sStake.id, // @ts-ignore assetABridge: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS, @@ -43,9 +44,7 @@ const core = new BurnerCore({ assets: [sStake, kStake] }) -const exchange = new Exchange({ - pairs: [StakeBridgePair] -}) +const exchange = new Exchange([StakeBridgePair]) const BurnerWallet = () => diff --git a/wallet/package.json b/wallet/package.json index 0d11f2f..4c97492 100644 --- a/wallet/package.json +++ b/wallet/package.json @@ -5,7 +5,7 @@ "dependencies": { "@burner-wallet/assets": "^1.1.10", "@burner-wallet/core": "^1.1.9", - "@burner-wallet/exchange": "^1.1.3", + "@burner-wallet/exchange": "^1.1.4", "@burner-wallet/metamask-plugin": "^1.0.1", "@burner-wallet/modern-ui": "^1.0.7", "@poanet/tokenbridge-bw-exchange": "^0.0.3", diff --git a/yarn.lock b/yarn.lock index 775a6fa..ade8788 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1215,16 +1215,6 @@ web3 "^1.2.2" web3-provider-engine "15.0.3" -"@burner-wallet/exchange@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@burner-wallet/exchange/-/exchange-1.1.3.tgz#18a3d6ad74e6b755318a390aa7936416aa614f05" - integrity sha512-8eWVhT5/Om0JmilsaaIRo4jDbsiTxMH+wwLOjJfZ868i0qIQmdwyvdKqk7PBNz+vwjt+tkpE5XTqRafGcZtyAg== - dependencies: - "@burner-wallet/types" "^1.0.0" - "@types/react" "*" - "@types/styled-components" "4.1.8" - styled-components "^5.0.1" - "@burner-wallet/exchange@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@burner-wallet/exchange/-/exchange-1.1.4.tgz#8763d9444aaf0cbf715dcbe377819b08fa751d67"