From af806088a0e232c3ca02251ebee5c54ce9b1fd44 Mon Sep 17 00:00:00 2001 From: wrap-that-potassium Date: Tue, 15 Feb 2022 22:41:45 +0100 Subject: [PATCH] wBAN on Fantom. --- .github/workflows/prod.yml | 34 +++ .github/workflows/staging.yml | 34 +++ .openzeppelin/unknown-250.json | 216 ++++++++++++++++++ .openzeppelin/unknown-4002.json | 216 ++++++++++++++++++ CHANGELOG.md | 3 + frontend/.env.fantom | 10 + frontend/.env.fantomstaging | 10 + frontend/jest.config.js | 6 +- frontend/package.json | 2 +- frontend/public/fantom-logo-only.svg | 3 + frontend/public/wban-logo-fantom.png | Bin 0 -> 16461 bytes frontend/public/wban-logo-fantom.svg | 26 +++ frontend/src/assets/fantom-logo.svg | 4 + frontend/src/assets/ftm-coin.png | Bin 0 -> 16231 bytes frontend/src/assets/wban-logo-fantom.svg | 26 +++ frontend/src/components/farms/Farm.vue | 12 +- frontend/src/config/constants/dex.ts | 6 +- frontend/src/config/constants/fantom/dex.ts | 5 + frontend/src/config/constants/fantom/farms.ts | 39 ++++ .../src/config/constants/fantom/tokens.ts | 40 ++++ frontend/src/config/constants/farms.ts | 4 +- frontend/src/config/constants/tokens.ts | 5 + frontend/src/layouts/MainLayout.vue | 8 +- frontend/src/models/FarmData.ts | 8 + frontend/src/store/modules/accounts.ts | 2 + frontend/src/store/modules/prices.ts | 3 + frontend/src/utils/BEP20Utils.ts | 4 + frontend/src/utils/FarmUtils.ts | 35 +-- frontend/src/utils/Networks.ts | 38 ++- hardhat.config.ts | 57 ++++- package.json | 19 +- yarn.lock | 103 +++++---- 32 files changed, 885 insertions(+), 93 deletions(-) create mode 100644 .openzeppelin/unknown-250.json create mode 100644 .openzeppelin/unknown-4002.json create mode 100644 frontend/.env.fantom create mode 100644 frontend/.env.fantomstaging create mode 100644 frontend/public/fantom-logo-only.svg create mode 100644 frontend/public/wban-logo-fantom.png create mode 100644 frontend/public/wban-logo-fantom.svg create mode 100644 frontend/src/assets/fantom-logo.svg create mode 100644 frontend/src/assets/ftm-coin.png create mode 100644 frontend/src/assets/wban-logo-fantom.svg create mode 100644 frontend/src/config/constants/fantom/dex.ts create mode 100644 frontend/src/config/constants/fantom/farms.ts create mode 100644 frontend/src/config/constants/fantom/tokens.ts diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index 1b74d425..fca56e37 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -39,6 +39,7 @@ jobs: run: | yarn yarn build + yarn test:unit working-directory: ${{env.working-directory}} - name: Deploy to bsc.banano.cc uses: jsmrcaga/action-netlify-deploy@v1.1.0 @@ -70,6 +71,7 @@ jobs: run: | yarn NODE_ENV=production yarn build --mode polygon + yarn test:unit working-directory: ${{env.working-directory}} - name: Deploy to polygon.banano.cc uses: jsmrcaga/action-netlify-deploy@v1.1.0 @@ -79,3 +81,35 @@ jobs: NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" NETLIFY_DEPLOY_TO_PROD: true build_directory: frontend/dist + build-and-deploy-frontend-for-fantom: + name: Fantom + runs-on: ubuntu-latest + env: + working-directory: frontend + steps: + - uses: actions/checkout@v2 + - name: Node.js + uses: actions/setup-node@v1 + with: + node-version: "14" + - run: npm install -g yarn + working-directory: ${{env.working-directory}} + - name: Build Smart Contract artifacts + run: | + yarn + yarn compile + working-directory: "." + - name: Compile & Test + run: | + yarn + NODE_ENV=production yarn build --mode fantom + yarn test:unit + working-directory: ${{env.working-directory}} + - name: Deploy to fantom.banano.cc + uses: jsmrcaga/action-netlify-deploy@v1.1.0 + with: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_FANTOM_MAINNET_SITE_ID }} + NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" + NETLIFY_DEPLOY_TO_PROD: true + build_directory: frontend/dist diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index db02a82a..6cc27d3f 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -39,6 +39,7 @@ jobs: run: | yarn yarn build --mode staging + yarn test:unit working-directory: ${{env.working-directory}} - name: Deploy to bsc-testnet.banano.cc uses: jsmrcaga/action-netlify-deploy@v1.1.0 @@ -70,6 +71,7 @@ jobs: run: | yarn yarn build --mode polygonstaging + yarn test:unit working-directory: ${{env.working-directory}} - name: Deploy to polygon-testnet.banano.cc uses: jsmrcaga/action-netlify-deploy@v1.1.0 @@ -79,3 +81,35 @@ jobs: NETLIFY_DEPLOY_MESSAGE: "Staging deploy v${{ github.ref }}" NETLIFY_DEPLOY_TO_PROD: true build_directory: frontend/dist + build-and-deploy-frontend-for-fantom: + name: dAPP for Fantom + runs-on: ubuntu-latest + env: + working-directory: frontend + steps: + - uses: actions/checkout@v2 + - name: Node.js + uses: actions/setup-node@v1 + with: + node-version: "14" + - run: npm install -g yarn + working-directory: ${{env.working-directory}} + - name: Build Smart Contract artifacts + run: | + yarn + yarn compile + working-directory: "." + - name: Compile & Test + run: | + yarn + yarn build --mode fantomstaging + yarn test:unit + working-directory: ${{env.working-directory}} + - name: Deploy to fantom-testnet.banano.cc + uses: jsmrcaga/action-netlify-deploy@v1.1.0 + with: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_FANTOM_TESTNET_SITE_ID }} + NETLIFY_DEPLOY_MESSAGE: "Staging deploy v${{ github.ref }}" + NETLIFY_DEPLOY_TO_PROD: true + build_directory: frontend/dist diff --git a/.openzeppelin/unknown-250.json b/.openzeppelin/unknown-250.json new file mode 100644 index 00000000..2e579717 --- /dev/null +++ b/.openzeppelin/unknown-250.json @@ -0,0 +1,216 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0x5B558024dfA4a79dB4aDe9784D194ed9c63BEC31", + "txHash": "0xc5279a2cf2e0fdfa3df649d193cc4ca85551dcc8bd40193cffc1ed55a34e97a6", + "deployTransaction": { + "hash": "0xc5279a2cf2e0fdfa3df649d193cc4ca85551dcc8bd40193cffc1ed55a34e97a6", + "type": 0, + "accessList": null, + "blockHash": null, + "blockNumber": null, + "transactionIndex": null, + "confirmations": 0, + "from": "0xFD1Dc8Bf39Bc0e373068746787c1296a5aEF31Ee", + "gasPrice": { + "type": "BigNumber", + "hex": "0x0174a32efe00" + }, + "gasLimit": { + "type": "BigNumber", + "hex": "0x075da0" + }, + "to": null, + "value": { + "type": "BigNumber", + "hex": "0x00" + }, + "nonce": 1, + "data": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610759806100616000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead146101645761007b565b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610515565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee366004610554565b610292565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461058c565b61031c565b34801561013057600080fd5b506100d161013f366004610554565b6103ad565b34801561015057600080fd5b506100d161015f366004610515565b610405565b34801561017057600080fd5b506100a061017f366004610515565b6104ef565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d9190610538565b949350505050565b6000546001600160a01b031633146102485760405162461bcd60e51b815260040161023f906106c0565b60405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146102bc5760405162461bcd60e51b815260040161023f906106c0565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146103465760405162461bcd60e51b815260040161023f906106c0565b60405163278f794360e11b81526001600160a01b03841690634f1ef286903490610376908690869060040161065d565b6000604051808303818588803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146103d75760405162461bcd60e51b815260040161023f906106c0565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe6906024016102e6565b6000546001600160a01b0316331461042f5760405162461bcd60e51b815260040161023f906106c0565b6001600160a01b0381166104945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b600060208284031215610526578081fd5b81356105318161070b565b9392505050565b600060208284031215610549578081fd5b81516105318161070b565b60008060408385031215610566578081fd5b82356105718161070b565b915060208301356105818161070b565b809150509250929050565b6000806000606084860312156105a0578081fd5b83356105ab8161070b565b925060208401356105bb8161070b565b9150604084013567ffffffffffffffff808211156105d7578283fd5b818601915086601f8301126105ea578283fd5b8135818111156105fc576105fc6106f5565b604051601f8201601f19908116603f01168101908382118183101715610624576106246106f5565b8160405282815289602084870101111561063c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060018060a01b038416825260206040818401528351806040850152825b818110156106985785810183015185820160600152820161067c565b818111156106a95783606083870101525b50601f01601f191692909201606001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461072057600080fd5b5056fea2646970667358221220d849f96f3086b9f82cdcf665adb8c697ace05638da1c7c16ab2d26293717af6764736f6c63430008020033", + "r": "0xa620fc53951620b8691bf5042052af71b9308f97cf56a0a4bc12506735914ccf", + "s": "0x6ba0c5caf2ca66ffc8edc69543bb01b96a0cb67bdedaf1f07e2c77490cd7b7ea", + "v": 535, + "creates": "0x5B558024dfA4a79dB4aDe9784D194ed9c63BEC31", + "chainId": 250 + } + }, + "proxies": [ + { + "address": "0xe20B9e246db5a0d21BF9209E4858Bc9A3ff7A034", + "txHash": "0xee68433542f031230c3829fca474eea0e25872e9d0bf70784a4d46919278af29", + "kind": "transparent" + } + ], + "impls": { + "f1be6678690eb8766e58118af5a21279979ac02812c19d8f2fd3ee89e223e9a2": { + "address": "0x7A654d7Baa1445B55f626d07e5816CE5bd2D853C", + "txHash": "0x634815099eeb7b106e236e85ea8af237c4066d5c10d88db4dec87e78f5268e67", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:39" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:44" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:31" + }, + { + "contract": "ERC20Upgradeable", + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:37" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:39" + }, + { + "contract": "ERC20Upgradeable", + "label": "_totalSupply", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:43" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)45_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:362" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:97" + }, + { + "contract": "ERC20PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol:42" + }, + { + "contract": "ERC165Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:36" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)43_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:64" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:232" + }, + { + "contract": "OwnableUpgradeable", + "label": "_owner", + "type": "t_address", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "contract": "OwnableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:82" + }, + { + "contract": "WBANToken", + "label": "_receipts", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/WBANToken.sol:18" + } + ], + "types": { + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_bool": { + "label": "bool" + }, + "t_address": { + "label": "address" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)43_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_struct(RoleData)43_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)" + }, + { + "label": "adminRole", + "type": "t_bytes32" + } + ] + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]" + } + } + } + } + } +} diff --git a/.openzeppelin/unknown-4002.json b/.openzeppelin/unknown-4002.json new file mode 100644 index 00000000..426af966 --- /dev/null +++ b/.openzeppelin/unknown-4002.json @@ -0,0 +1,216 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0x5B558024dfA4a79dB4aDe9784D194ed9c63BEC31", + "txHash": "0xd59103b6a04f4fe0c5e52327db41a3c830dea0677603159fc32e0e5505983011", + "deployTransaction": { + "hash": "0xd59103b6a04f4fe0c5e52327db41a3c830dea0677603159fc32e0e5505983011", + "type": 0, + "accessList": null, + "blockHash": "0x00001e3900002d4ade948a41ebe25951a161f8a1b879c45c04344c44cc340ab0", + "blockNumber": 8157785, + "transactionIndex": 1, + "confirmations": 3, + "from": "0xFD1Dc8Bf39Bc0e373068746787c1296a5aEF31Ee", + "gasPrice": { + "type": "BigNumber", + "hex": "0x32d30fe8c0" + }, + "gasLimit": { + "type": "BigNumber", + "hex": "0x0762b4" + }, + "to": null, + "value": { + "type": "BigNumber", + "hex": "0x00" + }, + "nonce": 1, + "data": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610759806100616000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead146101645761007b565b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610515565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee366004610554565b610292565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461058c565b61031c565b34801561013057600080fd5b506100d161013f366004610554565b6103ad565b34801561015057600080fd5b506100d161015f366004610515565b610405565b34801561017057600080fd5b506100a061017f366004610515565b6104ef565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d9190610538565b949350505050565b6000546001600160a01b031633146102485760405162461bcd60e51b815260040161023f906106c0565b60405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146102bc5760405162461bcd60e51b815260040161023f906106c0565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146103465760405162461bcd60e51b815260040161023f906106c0565b60405163278f794360e11b81526001600160a01b03841690634f1ef286903490610376908690869060040161065d565b6000604051808303818588803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146103d75760405162461bcd60e51b815260040161023f906106c0565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe6906024016102e6565b6000546001600160a01b0316331461042f5760405162461bcd60e51b815260040161023f906106c0565b6001600160a01b0381166104945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b600060208284031215610526578081fd5b81356105318161070b565b9392505050565b600060208284031215610549578081fd5b81516105318161070b565b60008060408385031215610566578081fd5b82356105718161070b565b915060208301356105818161070b565b809150509250929050565b6000806000606084860312156105a0578081fd5b83356105ab8161070b565b925060208401356105bb8161070b565b9150604084013567ffffffffffffffff808211156105d7578283fd5b818601915086601f8301126105ea578283fd5b8135818111156105fc576105fc6106f5565b604051601f8201601f19908116603f01168101908382118183101715610624576106246106f5565b8160405282815289602084870101111561063c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060018060a01b038416825260206040818401528351806040850152825b818110156106985785810183015185820160600152820161067c565b818111156106a95783606083870101525b50601f01601f191692909201606001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461072057600080fd5b5056fea2646970667358221220d849f96f3086b9f82cdcf665adb8c697ace05638da1c7c16ab2d26293717af6764736f6c63430008020033", + "r": "0xd72ef965edc7af67b586dc408529b0168ec7f6ec0ddc23b3f6db36a4f409ec34", + "s": "0x5f0653348b041e635f26d85d807b12f36b107c55de465a2c2d379b6229a83370", + "v": 8040, + "creates": "0x5B558024dfA4a79dB4aDe9784D194ed9c63BEC31", + "chainId": 4002 + } + }, + "proxies": [ + { + "address": "0xe20B9e246db5a0d21BF9209E4858Bc9A3ff7A034", + "txHash": "0x6dada6fda4326a964a24dd5120f9f158a990fc5d65fae92fcfe7e709618dfe88", + "kind": "transparent" + } + ], + "impls": { + "f1be6678690eb8766e58118af5a21279979ac02812c19d8f2fd3ee89e223e9a2": { + "address": "0x7A654d7Baa1445B55f626d07e5816CE5bd2D853C", + "txHash": "0xfe5a1e0b20526a185fbb2823d83a79a7f881f4147edb09d38366ea1c22b5414a", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:39" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:44" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:31" + }, + { + "contract": "ERC20Upgradeable", + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:37" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:39" + }, + { + "contract": "ERC20Upgradeable", + "label": "_totalSupply", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:43" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)45_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:362" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:97" + }, + { + "contract": "ERC20PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol:42" + }, + { + "contract": "ERC165Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:36" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)43_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:64" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:232" + }, + { + "contract": "OwnableUpgradeable", + "label": "_owner", + "type": "t_address", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "contract": "OwnableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:82" + }, + { + "contract": "WBANToken", + "label": "_receipts", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/WBANToken.sol:18" + } + ], + "types": { + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_bool": { + "label": "bool" + }, + "t_address": { + "label": "address" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)43_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_struct(RoleData)43_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)" + }, + { + "label": "adminRole", + "type": "t_bytes32" + } + ] + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]" + } + } + } + } + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 840acef5..1627cf5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# v1.5.0 +- Deployment on Fantom + # v1.4.0 ## New Features - Embedded swaps with the help of 0x protocol #88 diff --git a/frontend/.env.fantom b/frontend/.env.fantom new file mode 100644 index 00000000..39b1d6b0 --- /dev/null +++ b/frontend/.env.fantom @@ -0,0 +1,10 @@ +VUE_APP_TITLE=wBAN - Wrap your BAN on Fantom + +VUE_APP_BACKEND_URL=https://fantom-api.banano.cc +VUE_APP_ENV_NAME="production" +VUE_APP_BENIS_CONTRACT=0xD91f84D4E2d9f4fa508c61356A6CB81a306e5287 +VUE_APP_EXPECTED_CHAIN_ID=250 +VUE_APP_BLOCKCHAIN=fantom +VUE_APP_DEX_URL="https://spookyswap.finance" + +VUE_APP_ONBOARD_DAPP_ID=68fd0f1a-7387-4cfe-9a03-549e16e93711 diff --git a/frontend/.env.fantomstaging b/frontend/.env.fantomstaging new file mode 100644 index 00000000..f3eeff69 --- /dev/null +++ b/frontend/.env.fantomstaging @@ -0,0 +1,10 @@ +VUE_APP_TITLE=wBAN - Wrap your BAN on Fantom (staging) + +VUE_APP_BACKEND_URL=https://wban-api.kalixia.com +VUE_APP_ENV_NAME="staging" +VUE_APP_BENIS_CONTRACT=0x4b32b5E37E7Fe88c2052e20fC8074af21d43d83c +VUE_APP_EXPECTED_CHAIN_ID=4002 +VUE_APP_BLOCKCHAIN=fantom +VUE_APP_DEX_URL="https://app.sushi.com" + +VUE_APP_ONBOARD_DAPP_ID=68fd0f1a-7387-4cfe-9a03-549e16e93711 diff --git a/frontend/jest.config.js b/frontend/jest.config.js index 2388152a..07b771ea 100644 --- a/frontend/jest.config.js +++ b/frontend/jest.config.js @@ -27,9 +27,9 @@ module.exports = { coverageThreshold: { global: { statements: 15.3, - branches: 6.7, - functions: 7.3, - lines: 14.8, + branches: 6.6, + functions: 7.2, + lines: 15.1, } }, moduleFileExtensions: [ diff --git a/frontend/package.json b/frontend/package.json index 9229106d..c5603645 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.4.0", + "version": "1.5.0", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/frontend/public/fantom-logo-only.svg b/frontend/public/fantom-logo-only.svg new file mode 100644 index 00000000..327ed8bf --- /dev/null +++ b/frontend/public/fantom-logo-only.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/public/wban-logo-fantom.png b/frontend/public/wban-logo-fantom.png new file mode 100644 index 0000000000000000000000000000000000000000..188c433546b7655e3183e514866af965eb228ea9 GIT binary patch literal 16461 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 literal 0 HcmV?d00001 diff --git a/frontend/public/wban-logo-fantom.svg b/frontend/public/wban-logo-fantom.svg new file mode 100644 index 00000000..badc1fa4 --- /dev/null +++ b/frontend/public/wban-logo-fantom.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/fantom-logo.svg b/frontend/src/assets/fantom-logo.svg new file mode 100644 index 00000000..eb4130c1 --- /dev/null +++ b/frontend/src/assets/fantom-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/ftm-coin.png b/frontend/src/assets/ftm-coin.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e407a4bd89cb00d5f662ae6beb3a38a7b1809d GIT binary patch literal 16231 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/wban-logo-fantom.svg b/frontend/src/assets/wban-logo-fantom.svg new file mode 100644 index 00000000..badc1fa4 --- /dev/null +++ b/frontend/src/assets/wban-logo-fantom.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/farms/Farm.vue b/frontend/src/components/farms/Farm.vue index 98dbb116..1c7de1ec 100644 --- a/frontend/src/components/farms/Farm.vue +++ b/frontend/src/components/farms/Farm.vue @@ -332,13 +332,21 @@ export default class Farm extends Vue { addLiquidity() { if (this.value.quoteToken.address) { const otherToken = this.value.quoteToken.address[Farm.ENV_NAME as keyof Address] - if (Farm.DEX_URL === 'https://app.sushi.com' || Farm.DEX_URL === 'https://pancakeswap.finance') { + if ( + Farm.DEX_URL === 'https://app.sushi.com' || + Farm.DEX_URL === 'https://pancakeswap.finance' || + Farm.DEX_URL === 'https://spookyswap.finance' + ) { openURL(`${Farm.DEX_URL}/add/${this.wbanAddress}/${otherToken}`) } else { openURL(`${Farm.DEX_URL}/#/add/${this.wbanAddress}/${otherToken}`) } } else { - openURL(`${Farm.DEX_URL}/#/add/${this.wbanAddress}/ETH`) + if (Farm.DEX_URL === 'https://spookyswap.finance') { + openURL(`${Farm.DEX_URL}/add/${this.wbanAddress}/FTM`) + } else { + openURL(`${Farm.DEX_URL}/#/add/${this.wbanAddress}/ETH`) + } } } diff --git a/frontend/src/config/constants/dex.ts b/frontend/src/config/constants/dex.ts index 36f0f71f..310dd721 100644 --- a/frontend/src/config/constants/dex.ts +++ b/frontend/src/config/constants/dex.ts @@ -1,11 +1,13 @@ import BSCDEX from './bsc/dex' import PolygonDEX from './polygon/dex' +import FantomDEX from './fantom/dex' import axios from 'axios' import { Networks } from '@/utils/Networks' const networks = new Networks() const bsc = new BSCDEX() const polygon = new PolygonDEX() +const fantom = new FantomDEX() const BLOCKCHAIN: string = process.env.VUE_APP_BLOCKCHAIN || '' const BACKEND_URL: string = process.env.VUE_APP_BACKEND_URL || '' @@ -30,12 +32,12 @@ const EMPTY_TOKEN: Token = { function get0xSwapAPI(): string { switch (BLOCKCHAIN) { - // BSC farms case 'bsc': return bsc.get0xSwapAPI() - // Polygon farms case 'polygon': return polygon.get0xSwapAPI() + case 'fantom': + return fantom.get0xSwapAPI() default: throw new Error('Unexpected network') } diff --git a/frontend/src/config/constants/fantom/dex.ts b/frontend/src/config/constants/fantom/dex.ts new file mode 100644 index 00000000..cb1733ed --- /dev/null +++ b/frontend/src/config/constants/fantom/dex.ts @@ -0,0 +1,5 @@ +export default class DEX { + get0xSwapAPI(): string { + return 'https://fantom.api.0x.org/swap/v1/quote' + } +} diff --git a/frontend/src/config/constants/fantom/farms.ts b/frontend/src/config/constants/fantom/farms.ts new file mode 100644 index 00000000..78aebb02 --- /dev/null +++ b/frontend/src/config/constants/fantom/farms.ts @@ -0,0 +1,39 @@ +import tokens from '../tokens' +import { FarmConfig } from '../types' + +const farms: FarmConfig[] = [ + { + pid: 0, + lpSymbol: 'wBAN-USDC', + lpAddresses: { + dev: '', + staging: '', + production: '0x6bADcf8184a760326528b11057C00952811f77af', + }, + token: tokens.wban, + quoteToken: tokens.usdc, + endTime: { + dev: 0, + staging: 0, + production: 1648911600, + }, + }, + { + pid: 1, + lpSymbol: 'wBAN-FTM', + lpAddresses: { + dev: '', + staging: '', + production: '0x1406E49b5B0dA255307FE25cC21C675D4Ffc73e0', + }, + token: tokens.wban, + quoteToken: tokens.ftm, + endTime: { + dev: 0, + staging: 0, + production: 1648911600, + }, + }, +] + +export default farms diff --git a/frontend/src/config/constants/fantom/tokens.ts b/frontend/src/config/constants/fantom/tokens.ts new file mode 100644 index 00000000..7c2534ed --- /dev/null +++ b/frontend/src/config/constants/fantom/tokens.ts @@ -0,0 +1,40 @@ +import { TokensList } from '../types' + +const tokens: TokensList = { + wban: { + symbol: 'wBAN', + address: { + dev: '', + staging: '0xc7338729799Ca67A489fb9edb7a8D88821002E10', + production: '0xe20B9e246db5a0d21BF9209E4858Bc9A3ff7A034', + }, + decimals: 18, + projectLink: 'https://fantom.banano.cc/', + }, + ftm: { + symbol: 'FTM', + projectLink: 'https://fantom.foundation', + }, + wftm: { + symbol: 'WFTM', + address: { + dev: '', + staging: '', + production: '0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83', + }, + decimals: 18, + projectLink: 'https://fantom.banano.cc/', + }, + usdc: { + symbol: 'USDC', + address: { + dev: '', + staging: '', + production: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75', + }, + decimals: 6, + projectLink: 'https://www.centre.io', + }, +} + +export default tokens diff --git a/frontend/src/config/constants/farms.ts b/frontend/src/config/constants/farms.ts index 565c484c..b8705686 100644 --- a/frontend/src/config/constants/farms.ts +++ b/frontend/src/config/constants/farms.ts @@ -1,8 +1,10 @@ import { FarmConfig } from './types' import bsc from './bsc/farms' import polygon from './polygon/farms' +import fantom from './fantom/farms' const bscFarms: FarmConfig[] = bsc const polygonFarms: FarmConfig[] = polygon +const fantomFarms: FarmConfig[] = fantom -export { bscFarms, polygonFarms } +export { bscFarms, polygonFarms, fantomFarms } diff --git a/frontend/src/config/constants/tokens.ts b/frontend/src/config/constants/tokens.ts index 9692bf21..0fa9b950 100644 --- a/frontend/src/config/constants/tokens.ts +++ b/frontend/src/config/constants/tokens.ts @@ -1,9 +1,11 @@ import bsc from './bsc/tokens' import polygon from './polygon/tokens' +import fantom from './fantom/tokens' import { TokensList } from './types' const bscTokens: TokensList = bsc const polygonTokens: TokensList = polygon +const fantomTokens: TokensList = fantom const BLOCKCHAIN: string = process.env.VUE_APP_BLOCKCHAIN || '' @@ -16,6 +18,9 @@ switch (BLOCKCHAIN) { case 'polygon': tokens = polygonTokens break + case 'fantom': + tokens = fantomTokens + break default: console.warn('Unexpected network') } diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue index 1aab4eec..059c6d3f 100644 --- a/frontend/src/layouts/MainLayout.vue +++ b/frontend/src/layouts/MainLayout.vue @@ -144,7 +144,7 @@ import SettingsMenu from '@/components/SettingsMenu.vue' import { blockchainAddressFilter } from '@/utils/filters' import QRCode from 'qrcode' import { openURL } from 'quasar' -import { Network, Networks, BSC_MAINNET, POLYGON_MAINNET } from '@/utils/Networks' +import { Network, Networks, BSC_MAINNET, POLYGON_MAINNET, FANTOM_MAINNET } from '@/utils/Networks' const accountsStore = namespace('accounts') const banStore = namespace('ban') @@ -207,7 +207,11 @@ export default class MainLayout extends Vue { static DEX_URL: string = process.env.VUE_APP_DEX_URL || '' get isMainnet() { - return this.chainId === BSC_MAINNET.chainIdNumber || this.chainId === POLYGON_MAINNET.chainIdNumber + return ( + this.chainId === BSC_MAINNET.chainIdNumber || + this.chainId === POLYGON_MAINNET.chainIdNumber || + this.chainId === FANTOM_MAINNET.chainIdNumber + ) } get drawerEnabled() { diff --git a/frontend/src/models/FarmData.ts b/frontend/src/models/FarmData.ts index 824f02b2..94ffb4a3 100644 --- a/frontend/src/models/FarmData.ts +++ b/frontend/src/models/FarmData.ts @@ -10,8 +10,12 @@ interface PoolData { balanceToken1?: BigNumber // empty when wBAN stakiing priceToken0: number priceToken1: number + addressToken0: string + addressToken1: string symbolToken0: string symbolToken1: string + decimalsToken0: number + decimalsToken1: number } interface UserPoolData { @@ -52,8 +56,12 @@ export const EMPTY_FARM_DATA: FarmData = { balanceToken1: BN_ZERO, priceToken0: 0, priceToken1: 0, + addressToken0: '', + addressToken1: '', symbolToken0: '', symbolToken1: '', + decimalsToken0: 0, + decimalsToken1: 0, }, userPoolData: { balance: BN_ZERO, diff --git a/frontend/src/store/modules/accounts.ts b/frontend/src/store/modules/accounts.ts index 4062f50a..5a475217 100644 --- a/frontend/src/store/modules/accounts.ts +++ b/frontend/src/store/modules/accounts.ts @@ -125,6 +125,8 @@ class AccountsModule extends VuexModule { '56': networks.getNetworkData(56)?.rpcUrls[0] || '', '97': networks.getNetworkData(97)?.rpcUrls[0] || '', '137': networks.getNetworkData(137)?.rpcUrls[0] || '', + '250': networks.getNetworkData(250)?.rpcUrls[0] || '', + '4002': networks.getNetworkData(4002)?.rpcUrls[0] || '', '80001': networks.getNetworkData(80001)?.rpcUrls[0] || '', }, }, diff --git a/frontend/src/store/modules/prices.ts b/frontend/src/store/modules/prices.ts index 6d58d86b..954f4330 100644 --- a/frontend/src/store/modules/prices.ts +++ b/frontend/src/store/modules/prices.ts @@ -45,6 +45,7 @@ class PricesModule extends VuexModule { const bnbPrice: number = apiResponse.bnb const ethPrice: number = apiResponse.eth const maticPrice: number = apiResponse.matic + const ftmPrice: number = apiResponse.ftm const prices: Map = new Map() prices.set('BUSD', 1) prices.set('USDC', 1) @@ -55,6 +56,8 @@ class PricesModule extends VuexModule { prices.set('ETH', ethPrice) prices.set('WMATIC', maticPrice) prices.set('MATIC', maticPrice) + prices.set('FTM', ftmPrice) + prices.set('WFTM', ftmPrice) this.context.commit('setPrices', prices) this.context.commit('setLastUpdateTimestamp', Date.now()) } diff --git a/frontend/src/utils/BEP20Utils.ts b/frontend/src/utils/BEP20Utils.ts index faacf3e7..f01d3871 100644 --- a/frontend/src/utils/BEP20Utils.ts +++ b/frontend/src/utils/BEP20Utils.ts @@ -31,8 +31,10 @@ class BEP20Utils { const addressToken0 = await lp.token0() const addressToken1 = await lp.token1() const token0 = await IBEP20__factory.connect(addressToken0, signer) + const token0decimals = await token0.decimals() const liquidityToken0 = await token0.balanceOf(lpAddress) const token1 = await IBEP20__factory.connect(addressToken1, signer) + const token1decimals = await token1.decimals() const liquidityToken1 = await token1.balanceOf(lpAddress) // pool total supply const totalSupply = await lp.totalSupply() @@ -42,11 +44,13 @@ class BEP20Utils { return { token0: { address: addressToken0, + decimals: token0decimals, liquidity: liquidityToken0, user: userLiquidityToken0, }, token1: { address: addressToken1, + decimals: token1decimals, liquidity: liquidityToken1, user: userLiquidityToken1, }, diff --git a/frontend/src/utils/FarmUtils.ts b/frontend/src/utils/FarmUtils.ts index 47c773c0..586d229e 100644 --- a/frontend/src/utils/FarmUtils.ts +++ b/frontend/src/utils/FarmUtils.ts @@ -4,7 +4,7 @@ import { Benis } from '@artifacts/typechain' import { BigNumber, ethers, Signer } from 'ethers' import BenisUtils from './BenisUtils' import BEP20Utils from './BEP20Utils' -import { bscFarms, polygonFarms } from '@/config/constants/farms' +import { bscFarms, fantomFarms, polygonFarms } from '@/config/constants/farms' const BN_ONE = ethers.utils.parseEther('1') @@ -82,6 +82,9 @@ class FarmUtils { // Polygon farms case 'polygon': return polygonFarms + // Fantom farms + case 'fantom': + return fantomFarms default: throw new Error('Unexpected network') } @@ -129,35 +132,35 @@ class FarmUtils { farmData.poolData.symbolToken1 = await bep20.getTokenSymbol(lpDetails.token1.address, signer) farmData.userPendingRewards = await benis.pendingWBAN(farmData.pid, this.account) + const token0decimals = lpDetails.token0.decimals + const token1decimals = lpDetails.token1.decimals + farmData.userPoolData = { balance: userInfo.amount, - balanceToken0: lpDetails.token0.user, - balanceToken1: lpDetails.token1.user, + balanceToken0: ethers.utils.parseEther(ethers.utils.formatUnits(lpDetails.token0.user, token0decimals)), + balanceToken1: ethers.utils.parseEther(ethers.utils.formatUnits(lpDetails.token1.user, token1decimals)), } + farmData.poolData.addressToken0 = lpDetails.token0.address + farmData.poolData.addressToken1 = lpDetails.token1.address + farmData.poolData.decimalsToken0 = token0decimals + farmData.poolData.decimalsToken1 = token1decimals + const liquidityToken0: BigNumber = lpDetails.token0.liquidity const liquidityToken1: BigNumber = lpDetails.token1.liquidity - console.debug( - `Liquidities: token0: ${ethers.utils.formatEther(liquidityToken0)}, token1: ${ethers.utils.formatEther( - liquidityToken1 - )}` - ) - const liquidityUsdToken0: BigNumber = liquidityToken0 + const liquidityUsdToken0: BigNumber = ethers.utils + .parseEther(ethers.utils.formatUnits(liquidityToken0, token0decimals)) .mul(ethers.utils.parseEther(farmData.poolData.priceToken0.toString())) .div(BN_ONE) - const liquidityUsdToken1: BigNumber = liquidityToken1 + const liquidityUsdToken1: BigNumber = ethers.utils + .parseEther(ethers.utils.formatUnits(liquidityToken1, token1decimals)) .mul(ethers.utils.parseEther(farmData.poolData.priceToken1.toString())) .div(BN_ONE) - console.debug( - `Liquidities in USD: token0: $${ethers.utils.formatEther( - liquidityUsdToken0 - )}, token1: $${ethers.utils.formatEther(liquidityUsdToken1)}` - ) poolLiquidityUsd = liquidityUsdToken0.add(liquidityUsdToken1) } farmData.poolData.tvl = poolLiquidityUsd - console.debug(`Pool liquidity price: ${ethers.utils.formatEther(poolLiquidityUsd)}`) + console.debug(`Pool liquidity price: $${ethers.utils.formatEther(poolLiquidityUsd)}`) farmData.apr = await benisUtils.getFarmAPR(farmData.pid, envName, wbanPriceUsd, poolLiquidityUsd, benis) return farmData diff --git a/frontend/src/utils/Networks.ts b/frontend/src/utils/Networks.ts index e9bf4dd3..d689a907 100644 --- a/frontend/src/utils/Networks.ts +++ b/frontend/src/utils/Networks.ts @@ -2,7 +2,7 @@ import axios from 'axios' import { BigNumber, ethers } from 'ethers' interface Network { - network: 'bsc' | 'polygon' + network: 'bsc' | 'polygon' | 'fantom' chainId: string chainIdNumber: number chainName: string @@ -90,6 +90,38 @@ const POLYGON_TESTNET: Network = { blockExplorerUrls: ['https://mumbai.polygonscan.com'], } +const FANTOM_MAINNET: Network = { + network: 'fantom', + chainId: '0xFA', + chainIdNumber: 250, + chainName: 'Fantom', + chainUrl: 'https://fantom.foundation', + nativeCurrency: { + name: 'FTM', + symbol: 'FTM', + decimals: 18, + }, + minimumNeededForWrap: 0.03, + rpcUrls: ['https://rpc.ankr.com/fantom'], + blockExplorerUrls: ['https://ftmscan.com'], +} + +const FANTOM_TESTNET: Network = { + network: 'fantom', + chainId: '0xFA2', + chainIdNumber: 4002, + chainName: 'Fantom Testnet', + chainUrl: 'https://fantom.foundation', + nativeCurrency: { + name: 'FTM', + symbol: 'FTM', + decimals: 18, + }, + minimumNeededForWrap: 0.03, + rpcUrls: ['https://rpc.testnet.fantom.network'], + blockExplorerUrls: ['https://testnet.ftmscan.com'], +} + const BACKEND_URL: string = process.env.VUE_APP_BACKEND_URL || '' class Networks { @@ -103,6 +135,8 @@ class Networks { this.networks.set(BSC_TESTNET.chainIdNumber, BSC_TESTNET) this.networks.set(POLYGON_MAINNET.chainIdNumber, POLYGON_MAINNET) this.networks.set(POLYGON_TESTNET.chainIdNumber, POLYGON_TESTNET) + this.networks.set(FANTOM_MAINNET.chainIdNumber, FANTOM_MAINNET) + this.networks.set(FANTOM_TESTNET.chainIdNumber, FANTOM_TESTNET) } public getNetworkData(chainId: number): Network | undefined { @@ -124,4 +158,4 @@ class Networks { } } -export { Networks, Network, BSC_MAINNET, POLYGON_MAINNET } +export { Networks, Network, BSC_MAINNET, POLYGON_MAINNET, FANTOM_MAINNET } diff --git a/hardhat.config.ts b/hardhat.config.ts index 22633a80..6745d171 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -60,6 +60,25 @@ task("wban:deploy", "Deploy wBAN") } }); +task("wban:verify", "Verify wBAN source code on blockchain explorer") + .setAction(async (args, hre) => { + const WBANToken = await hre.ethers.getContractFactory("WBANToken"); + + // peer into OpenZeppelin manifest to extract the implementation address + const ozUpgradesManifestClient = await Manifest.forNetwork(hre.network.provider); + const manifest = await ozUpgradesManifestClient.read(); + const bytecodeHash = hashBytecodeWithoutMetadata(WBANToken.bytecode); + const implementationContract = manifest.impls[bytecodeHash]; + + // verify implementation contract + if (implementationContract) { + console.log(`wBAN impl deployed at: "${implementationContract.address}"`); + await hre.run("verify:verify", { + address: implementationContract.address + }); + } + }); + task("wban:upgrade", "Upgrade wBAN") .addParam("contract", "The smart-contract address", '', types.string) .setAction(async (args, hre) => { @@ -116,6 +135,26 @@ task("benis:deploy", "Deploy Benis") console.log(`Benis deployed and verified at "${benis.address}" with rewardsPerSecond ${rewardsPerSecond.toString()} and startTime ${rewardsStartTime}`); }); +task("benis:verify", "Verify Benis source code on blockchain explorer") + .addParam("benis", "The address of Benis smart-contract", '', types.string) + .addParam("wban", "The address of wBAN smart-contract", '', types.string) + .addParam("rewards", "The number of wBAN to reward per second", 1, types.float) + .addParam("starttime", "The timestamp at which Benis farms should start", 0, types.int) + .setAction(async (args, hre) => { + const benisAddress = args.benis; + const rewardsPerSecond = hre.ethers.utils.parseEther(args.rewards.toString()); + let rewardsStartTime = args.starttime == 0 ? (await hre.ethers.provider.getBlock('latest')).timestamp : args.starttime; + console.log(`Benis deployed at: "${benisAddress}"`); + await hre.run("verify:verify", { + address: benisAddress, + constructorArguments: [ + args.wban, + rewardsPerSecond, + rewardsStartTime + ] + }); + }); + task("benis:add-time", "Deploy Benis") .addParam("benis", "The address of Benis smart-contract", '', types.string) .addParam("time", "Number of seconds to extends Benis end time to", 1, types.int) @@ -263,7 +302,7 @@ const config: HardhatUserConfig = { }, */ polygontestnet: { - url: 'https://speedy-nodes-nyc.moralis.io/3fb1dabd5bbe4112064814a2/polygon/mumbai', + url: 'https://rpc-mumbai.maticvigil.com', accounts, chainId: 80001, gasMultiplier: 1.1, @@ -275,7 +314,19 @@ const config: HardhatUserConfig = { chainId: 137, gasMultiplier: 1.1, gasPrice: 60000000000, - } + }, + fantomtestnet: { + url: 'https://rpc.testnet.fantom.network', + accounts, + chainId: 4002, + }, + fantom: { + url: 'https://rpc.ftm.tools', + accounts, + chainId: 250, + gasMultiplier: 1.4, + //gasPrice: 4000000000000, + }, }, typechain: { outDir: 'artifacts/typechain', @@ -310,7 +361,7 @@ const config: HardhatUserConfig = { abiExporter: { path: './abi', clear: true, - flat: false, + flat: true, // only: ['WBANToken', 'Benis'], spacing: 2 } diff --git a/package.json b/package.json index b4ce223a..866c9a83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wban-smart-contract", - "version": "1.4.0", + "version": "1.5.0", "description": "dApp for swapping BAN to wBAN on Binance Smart Chain", "author": "Wrap That Potassium ", "license": "GPL-3.0-or-later", @@ -27,15 +27,15 @@ "@ethersproject/abi": "^5.4.7", "@ethersproject/bytes": "^5.4.7", "@ethersproject/providers": "^5.4.7", - "@nomiclabs/hardhat-ethers": "^2.0.3", - "@nomiclabs/hardhat-etherscan": "^2.1.8", + "@nomiclabs/hardhat-ethers": "^2.0.5", + "@nomiclabs/hardhat-etherscan": "^3.0.1", "@nomiclabs/hardhat-solhint": "^2.0.0", - "@nomiclabs/hardhat-waffle": "^2.0.1", + "@nomiclabs/hardhat-waffle": "^2.0.2", "@openzeppelin/contracts-upgradeable": "^4.3.2", "@openzeppelin/hardhat-upgrades": "^1.10.0", "@pancakeswap/pancake-swap-lib": "^0.0.4", - "@typechain/ethers-v5": "^8.0.5", - "@typechain/hardhat": "^3.1.0", + "@typechain/ethers-v5": "^9.0.0", + "@typechain/hardhat": "^4.0.0", "@types/bn.js": "^5.1.0", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -47,12 +47,13 @@ "dotenv": "^8.2.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.4.7", - "hardhat": "^2.8.0", - "hardhat-abi-exporter": "^2.6.1", + "hardhat": "^2.8.4", + "hardhat-abi-exporter": "^2.8.0", "hardhat-dependency-compiler": "^1.1.2", "hardhat-log-remover": "^2.0.2", "hardhat-preprocessor": "^0.1.4", "hardhat-spdx-license-identifier": "^2.0.3", + "lodash": "^4.17.21", "mocha": "^8.3.2", "prettier": "^2.2.1", "prettier-plugin-solidity": "^1.0.0-beta.10", @@ -61,7 +62,7 @@ "solidity-coverage": "0.7.17", "ts-generator": "^0.1.1", "ts-node": "^10.2.1", - "typechain": "^6.1.0", + "typechain": "^7.0.0", "typescript": "^4.5.4" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 32e1689b..99fba004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2332,6 +2332,17 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== +"@metamask/eth-sig-util@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" + integrity sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + "@microsoft/fetch-event-source@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" @@ -2373,15 +2384,15 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@nomiclabs/hardhat-ethers@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.3.tgz#06e20a57274f6ce3148132910e723948a711edf1" - integrity sha512-IJ0gBotVtO7YyLZyHNgbxzskUtFok+JkRlKPo8YELqj1ms9XL6Qm3vsfsGdZr22wnJeVEF5TQPotKuwQk21Dag== +"@nomiclabs/hardhat-ethers@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" + integrity sha512-A2gZAGB6kUvLx+kzM92HKuUF33F1FSe90L0TmkXkT2Hh0OKRpvWZURUSU2nghD2yC4DzfEZ3DftfeHGvZ2JTUw== -"@nomiclabs/hardhat-etherscan@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.8.tgz#e206275e96962cd15e5ba9148b44388bc922d8c2" - integrity sha512-0+rj0SsZotVOcTLyDOxnOc3Gulo8upo0rsw/h+gBPcmtj91YqYJNhdARHoBxOhhE8z+5IUQPx+Dii04lXT14PA== +"@nomiclabs/hardhat-etherscan@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.1.tgz#25013e464451e75273736eada6473d98be56c283" + integrity sha512-ZeDMqUvbmWGSpsCkyD7QOsJ3lytNgmoOPpglOtgCfoIewb1o2Nz1PgofWYsSdIiWBtIN9rBF8ldU2jVpgsNhHg== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -2398,10 +2409,10 @@ dependencies: solhint "^2.0.0" -"@nomiclabs/hardhat-waffle@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2" - integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ== +"@nomiclabs/hardhat-waffle@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.2.tgz#6030aa6fd9ea05327bf79d1107356af906d8b1e4" + integrity sha512-dnhry6Bj15O8L3pBksTuXfr4RAUIf+BxRxWJXiu+ioSawcQaOcNF4gfMxn6ik0auk3zrsAJLA6m9vqe87d4xvg== dependencies: "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" @@ -3279,18 +3290,18 @@ dependencies: ethers "^5.0.2" -"@typechain/ethers-v5@^8.0.5": - version "8.0.5" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-8.0.5.tgz#d469420e9a73deb7fa076cde9edb45d713dd1b8c" - integrity sha512-ntpj4cS3v4WlDu+hSKSyj9A3o1tKtWC30RX1gobeYymZColeJiUemC1Kgfa0MWGmInm5CKxoHVhEvYVgPOZn1A== +"@typechain/ethers-v5@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-9.0.0.tgz#6aa93bea7425c0463bd8a61eea3643540ef851bd" + integrity sha512-bAanuPl1L2itaUdMvor/QvwnIH+TM/CmG00q17Ilv3ZZMeJ2j8HcarhgJUZ9pBY1teBb85P8cC03dz3mSSx+tQ== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" -"@typechain/hardhat@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-3.1.0.tgz#88bd9e9d55e30fbece6fbb34c03ecd40a8b2013a" - integrity sha512-C6Be6l+vTpao19PvMH2CB/lhL1TRLkhdPkvQCF/zqkY1e+0iqY2Bb9Jd3PTt6I8QvMm89ZDerrCJC9927ZHmlg== +"@typechain/hardhat@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-4.0.0.tgz#976d4dcc0d9237602d722801d30adc573c529981" + integrity sha512-SeEKtiHu4Io3LHhE8VV3orJbsj7dwJZX8pzSTv7WQR38P18vOLm2M52GrykVinMpkLK0uVc88ICT58emvfn74w== dependencies: fs-extra "^9.1.0" @@ -7642,18 +7653,6 @@ eth-sig-util@^1.4.2: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" -eth-sig-util@^2.5.2: - version "2.5.3" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" - integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - eth-tx-summary@^3.1.2: version "3.2.4" resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" @@ -7846,7 +7845,7 @@ ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@ ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: +ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -8127,7 +8126,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.3: +ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -9386,10 +9385,10 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-abi-exporter@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.6.1.tgz#fcd8966cf128b29f2693887621be20cebc906d36" - integrity sha512-XJj5ZaeBOAuzDzxp8kBbnAlKJZaju0cDBXk0cE7Lphftr+XX5e8XzHU7keZhQIi2dn85dxTrqEY8F/kdltI+hw== +hardhat-abi-exporter@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.8.0.tgz#e7ed6216c16acf84158909d856577f0a8832ec55" + integrity sha512-HQwd9Agr2O5znUg9Dzicw8grsXacoMSQsS5ZhBBNyaxKeVbvxL1Ubm9ss8sSVGr74511a8qiR2Ljm/lsLS9Mew== dependencies: "@ethersproject/abi" "^5.5.0" delete-empty "^3.0.0" @@ -9416,10 +9415,10 @@ hardhat-spdx-license-identifier@^2.0.3: resolved "https://registry.yarnpkg.com/hardhat-spdx-license-identifier/-/hardhat-spdx-license-identifier-2.0.3.tgz#6dd89a7e036ede4f7e86fb349eb23daaaad6890f" integrity sha512-G4u4I1md0tWaitX6Os7Nq9sYZ/CFdR+ibm7clCksGJ4yrtdHEZxgLjWpJ0WiALF9SoFKt03PwCe9lczDQ/5ADA== -hardhat@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.8.0.tgz#4701fafe2de4fe88bed328561e554df85455385b" - integrity sha512-A2L5F+B7HgdvfcuEWBXyokzP3biSlu4UeIvNR/lgSC0Og/2kbP9cjMMkIH42V1W8nQEZk70VuryhVKX2uHwSYw== +hardhat@^2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.8.4.tgz#b12cc8b8ea578fc6cefbcd9683d558adc302152d" + integrity sha512-lEwvQSbhABpKgBTJnRgdZ6nZZRmgKUF2G8aGNaBVIQnJeRZjELnZHLIWXAF1HW0Q1NFCyo9trxOrOuzmiS+r/w== dependencies: "@ethereumjs/block" "^3.6.0" "@ethereumjs/blockchain" "^5.5.0" @@ -9427,6 +9426,7 @@ hardhat@^2.8.0: "@ethereumjs/tx" "^3.4.0" "@ethereumjs/vm" "^5.6.0" "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" "@sentry/node" "^5.18.1" "@solidity-parser/parser" "^0.14.0" "@types/bn.js" "^5.1.0" @@ -9440,7 +9440,6 @@ hardhat@^2.8.0: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - eth-sig-util "^2.5.2" ethereum-cryptography "^0.1.2" ethereumjs-abi "^0.6.8" ethereumjs-util "^7.1.3" @@ -9452,9 +9451,9 @@ hardhat@^2.8.0: immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "^4.2.0" + merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^7.1.2" + mocha "^7.2.0" node-fetch "^2.6.0" qs "^6.7.0" raw-body "^2.4.1" @@ -11463,7 +11462,7 @@ lodash@4.17.20, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17. resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.20, lodash@^4.2.1: +lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11747,7 +11746,7 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.0, merkle-patricia-tree@^4.2.2: +merkle-patricia-tree@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.2.tgz#6dec17855370172458244c2f42c989dd60b773a3" integrity sha512-eqZYNTshcYx9aESkSPr71EqwsR/QmpnObDEV4iLxkt/x/IoLYZYjJvKY72voP/27Vy61iMOrfOG6jrn7ttXD+Q== @@ -11987,7 +11986,7 @@ mocha@8.1.2: yargs-parser "13.1.2" yargs-unparser "1.6.1" -mocha@^7.1.2: +mocha@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== @@ -16101,10 +16100,10 @@ typechain@^3.0.0: ts-essentials "^6.0.3" ts-generator "^0.1.1" -typechain@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-6.1.0.tgz#462a35f555accf870689d1ba5698749108d0ce81" - integrity sha512-GGfkK0p3fUgz8kYxjSS4nKcWXE0Lo+teHTetghousIK5njbNoYNDlwn91QIyD181L3fVqlTvBE0a/q3AZmjNfw== +typechain@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-7.0.0.tgz#258ca136de1d451368bde01c318976a83062f110" + integrity sha512-ILfvBBFJ7j9aIk0crX03+N2GmzoDN1gtk32G1+XrasjuvXS0XAw2XxwQeQMMgKwlnxViJjIkG87sTMYXPkXA9g== dependencies: "@types/prettier" "^2.1.1" debug "^4.1.1"