diff --git a/SmartContracts/abi/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol/AggregatorV3Interface.json b/SmartContracts/abi/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol/AggregatorV3Interface.json new file mode 100644 index 00000000..9fe87222 --- /dev/null +++ b/SmartContracts/abi/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol/AggregatorV3Interface.json @@ -0,0 +1,113 @@ +[ + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "description", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_roundId", + "type": "uint80" + } + ], + "name": "getRoundData", + "outputs": [ + { + "internalType": "uint80", + "name": "roundId", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "startedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "updatedAt", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "answeredInRound", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestRoundData", + "outputs": [ + { + "internalType": "uint80", + "name": "roundId", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "startedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "updatedAt", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "answeredInRound", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/SmartContracts/abi/contracts/PriceFeed.sol/DataConsumerV3.json b/SmartContracts/abi/contracts/PriceFeed.sol/DataConsumerV3.json new file mode 100644 index 00000000..d888b571 --- /dev/null +++ b/SmartContracts/abi/contracts/PriceFeed.sol/DataConsumerV3.json @@ -0,0 +1,41 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "getLatestDataFrom", + "outputs": [ + { + "internalType": "uint80", + "name": "roundId", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "startedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "updatedAt", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "answeredInRound", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/SmartContracts/contracts/PriceFeed.sol b/SmartContracts/contracts/PriceFeed.sol new file mode 100644 index 00000000..7c736b59 --- /dev/null +++ b/SmartContracts/contracts/PriceFeed.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +contract DataConsumerV3 { + /** + * Returns the latest answer from the specified aggregator. + */ + function getLatestDataFrom( + address aggregator + ) + public + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + AggregatorV3Interface dataFeed = AggregatorV3Interface(aggregator); + return dataFeed.latestRoundData(); + } +} diff --git a/SmartContracts/package-lock.json b/SmartContracts/package-lock.json index dfe220fd..f20943fb 100644 --- a/SmartContracts/package-lock.json +++ b/SmartContracts/package-lock.json @@ -8,6 +8,7 @@ "name": "chainbrary-smart-contacts", "version": "0.0.0", "dependencies": { + "@chainlink/contracts": "^0.6.1", "@graphprotocol/graph-cli": "^0.51.2", "@openzeppelin/contracts": "^4.9.2" }, @@ -58,6 +59,83 @@ "node": ">=6.9.0" } }, + "node_modules/@chainlink/contracts": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz", + "integrity": "sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ==", + "dependencies": { + "@eth-optimism/contracts": "^0.5.21", + "@openzeppelin/contracts": "~4.3.3", + "@openzeppelin/contracts-upgradeable": "^4.7.3", + "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" + } + }, + "node_modules/@chainlink/contracts/node_modules/@eth-optimism/contracts": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.5.40.tgz", + "integrity": "sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==", + "dependencies": { + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" + }, + "peerDependencies": { + "ethers": "^5" + } + }, + "node_modules/@chainlink/contracts/node_modules/@openzeppelin/contracts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", + "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==" + }, + "node_modules/@chainlink/contracts/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", @@ -95,11 +173,33 @@ "node": ">=12" } }, + "node_modules/@eth-optimism/core-utils": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", + "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bufio": "^1.0.7", + "chai": "^4.3.4" + } + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "funding": [ { "type": "individual", @@ -212,7 +312,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, "funding": [ { "type": "individual", @@ -288,7 +387,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, "funding": [ { "type": "individual", @@ -342,7 +440,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, "funding": [ { "type": "individual", @@ -372,7 +469,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, "funding": [ { "type": "individual", @@ -455,7 +551,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, "funding": [ { "type": "individual", @@ -493,7 +588,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, "funding": [ { "type": "individual", @@ -531,7 +625,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, "engines": { "node": ">=8.3.0" }, @@ -552,7 +645,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, "funding": [ { "type": "individual", @@ -591,7 +683,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, "funding": [ { "type": "individual", @@ -635,7 +726,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, "funding": [ { "type": "individual", @@ -705,7 +795,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, "funding": [ { "type": "individual", @@ -726,7 +815,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, "funding": [ { "type": "individual", @@ -781,7 +869,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, "funding": [ { "type": "individual", @@ -2294,6 +2381,17 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" }, + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz", + "integrity": "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" + }, + "node_modules/@openzeppelin/contracts-v0.7": { + "name": "@openzeppelin/contracts", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", + "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" + }, "node_modules/@peculiar/asn1-schema": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", @@ -2918,8 +3016,7 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "node_modules/agent-base": { "version": "6.0.2", @@ -3177,8 +3274,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -3288,8 +3383,7 @@ "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/bigint-crypto-utils": { "version": "3.3.0", @@ -3492,6 +3586,14 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, + "node_modules/bufio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz", + "integrity": "sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3604,8 +3706,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -3659,8 +3759,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -4156,8 +4254,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -5879,8 +5975,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -7860,8 +7954,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "peer": true, "dependencies": { "get-func-name": "^2.0.0" } @@ -8924,8 +9016,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -11354,8 +11444,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -12169,6 +12257,72 @@ "js-tokens": "^4.0.0" } }, + "@chainlink/contracts": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz", + "integrity": "sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ==", + "requires": { + "@eth-optimism/contracts": "^0.5.21", + "@openzeppelin/contracts": "~4.3.3", + "@openzeppelin/contracts-upgradeable": "^4.7.3", + "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" + }, + "dependencies": { + "@eth-optimism/contracts": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.5.40.tgz", + "integrity": "sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==", + "requires": { + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" + } + }, + "@openzeppelin/contracts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", + "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==" + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "peer": true, + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + } + } + }, "@chainsafe/as-sha256": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", @@ -12203,11 +12357,33 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@eth-optimism/core-utils": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", + "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bufio": "^1.0.7", + "chai": "^4.3.4" + } + }, "@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -12270,7 +12446,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -12306,7 +12481,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, "requires": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -12340,7 +12514,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -12360,7 +12533,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -12403,7 +12575,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -12421,7 +12592,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -12449,7 +12619,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, "requires": {} } } @@ -12458,7 +12627,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -12477,7 +12645,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -12501,7 +12668,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -12541,7 +12707,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -12552,7 +12717,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -12587,7 +12751,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -13755,6 +13918,16 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" }, + "@openzeppelin/contracts-upgradeable": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz", + "integrity": "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" + }, + "@openzeppelin/contracts-v0.7": { + "version": "npm:@openzeppelin/contracts@3.4.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", + "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" + }, "@peculiar/asn1-schema": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", @@ -14306,8 +14479,7 @@ "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "agent-base": { "version": "6.0.2", @@ -14506,9 +14678,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "astral-regex": { "version": "2.0.0", @@ -14588,8 +14758,7 @@ "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "bigint-crypto-utils": { "version": "3.3.0", @@ -14759,6 +14928,11 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, + "bufio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz", + "integrity": "sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==" + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -14838,8 +15012,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -14880,9 +15052,7 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" }, "chokidar": { "version": "3.5.3", @@ -15268,8 +15438,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, "requires": { "type-detect": "^4.0.0" } @@ -16653,9 +16821,7 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" }, "get-intrinsic": { "version": "1.2.0", @@ -18150,8 +18316,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "peer": true, "requires": { "get-func-name": "^2.0.0" } @@ -18950,9 +19114,7 @@ "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "pbkdf2": { "version": "3.1.2", @@ -20838,9 +21000,7 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.21.3", diff --git a/SmartContracts/package.json b/SmartContracts/package.json index 304663ff..f174b0f5 100644 --- a/SmartContracts/package.json +++ b/SmartContracts/package.json @@ -17,6 +17,7 @@ "prettier-plugin-solidity": "^1.1.3" }, "dependencies": { + "@chainlink/contracts": "^0.6.1", "@graphprotocol/graph-cli": "^0.51.2", "@openzeppelin/contracts": "^4.9.2" } diff --git a/UI/package-lock.json b/UI/package-lock.json index e26b8644..7f54a941 100644 --- a/UI/package-lock.json +++ b/UI/package-lock.json @@ -18,8 +18,8 @@ "@angular/platform-browser": "^15.2.4", "@angular/platform-browser-dynamic": "^15.2.4", "@angular/router": "^15.2.4", - "@apollo/client": "^3.7.17", - "@chainbrary/web3-login": "^0.0.15", + "@apollo/client": "^3.7.16", + "@chainbrary/web3-login": "^0.0.16", "@eslint-community/regexpp": "^4.5.1", "@ngrx/effects": "^15.4.0", "@ngrx/entity": "^15.4.0", @@ -3107,9 +3107,9 @@ } }, "node_modules/@chainbrary/web3-login": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@chainbrary/web3-login/-/web3-login-0.0.15.tgz", - "integrity": "sha512-bLLCMXe42pFUVwjlLZ5P+JvBLc3ioXYERn6dIeUfxuO9FttpGH8N9SHX7+tFNLkHgwHbhTM3S33amXjjil2JLQ==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@chainbrary/web3-login/-/web3-login-0.0.16.tgz", + "integrity": "sha512-001RW68ncwmFZOR+0YKJGFjJeFmTWoumDsBQuU0zutfrm0e6EgpErq2vO5zeDOTqGhk5NN9sFo8Nr3Zs2kf3ZA==", "dependencies": { "tslib": "^2.3.0" }, @@ -20401,9 +20401,9 @@ } }, "@chainbrary/web3-login": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@chainbrary/web3-login/-/web3-login-0.0.15.tgz", - "integrity": "sha512-bLLCMXe42pFUVwjlLZ5P+JvBLc3ioXYERn6dIeUfxuO9FttpGH8N9SHX7+tFNLkHgwHbhTM3S33amXjjil2JLQ==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@chainbrary/web3-login/-/web3-login-0.0.16.tgz", + "integrity": "sha512-001RW68ncwmFZOR+0YKJGFjJeFmTWoumDsBQuU0zutfrm0e6EgpErq2vO5zeDOTqGhk5NN9sFo8Nr3Zs2kf3ZA==", "requires": { "tslib": "^2.3.0" } diff --git a/UI/package.json b/UI/package.json index 5069868c..20046221 100644 --- a/UI/package.json +++ b/UI/package.json @@ -25,7 +25,7 @@ "@angular/platform-browser-dynamic": "^15.2.4", "@angular/router": "^15.2.4", "@apollo/client": "^3.7.17", - "@chainbrary/web3-login": "^0.0.15", + "@chainbrary/web3-login": "^0.0.16", "@eslint-community/regexpp": "^4.5.1", "@ngrx/effects": "^15.4.0", "@ngrx/entity": "^15.4.0", diff --git a/UI/projects/web3-login/package.json b/UI/projects/web3-login/package.json index e25983de..2a0f6c2a 100644 --- a/UI/projects/web3-login/package.json +++ b/UI/projects/web3-login/package.json @@ -1,6 +1,6 @@ { "name": "@chainbrary/web3-login", - "version": "0.0.15", + "version": "0.0.16", "peerDependencies": { "@angular/common": "^15.1.0", "@angular/core": "^15.1.0", diff --git a/UI/projects/web3-login/src/lib/interfaces/modalState.interface.ts b/UI/projects/web3-login/src/lib/interfaces/modalState.interface.ts index 623a9b2a..18d3fa43 100644 --- a/UI/projects/web3-login/src/lib/interfaces/modalState.interface.ts +++ b/UI/projects/web3-login/src/lib/interfaces/modalState.interface.ts @@ -8,8 +8,8 @@ export interface IModalState { } export interface INetworkDetail { - chainId: string; - chainCode: string; + chainId: NetworkChainId; + chainCode: NetworkChainCode; name: string; shortName: string; nativeCurrency: { @@ -25,3 +25,33 @@ export enum ModalStateType { CANCEL = 'cancel', LOADING = 'loading' } + +export enum NetworkChainId { + ETHEREUM = '1', + BNB = '56', + SEPOLIA = '11155111', + ARBITRUM = '42161', + POLYGON = '137', + OPTIMISM = '10', + AVALANCHE = '43114', + MOONBEAM = '1284', + KAVA = '222', + FANTOM = '250', + CELO = '42220', + UNKNOWN = '0' +} + +export enum NetworkChainCode { + ETHEREUM = '0x1', + BNB = '0x38', + SEPOLIA = '0xaa36a7', + ARBITRUM = '0xa4b1', + POLYGON = '0x89', + OPTIMISM = '0xa', + AVALANCHE = '0xa86a', + MOONBEAM = '0x504', + KAVA = '0x8ae', + FANTOM = '0xfa', + CELO = '0xa4ec', + UNKNOWN = '0' +} diff --git a/UI/projects/web3-login/src/lib/services/network/network.service.ts b/UI/projects/web3-login/src/lib/services/network/network.service.ts index b0521d75..eaba9971 100644 --- a/UI/projects/web3-login/src/lib/services/network/network.service.ts +++ b/UI/projects/web3-login/src/lib/services/network/network.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { EMPTY, Observable, defer, of } from 'rxjs'; import Web3 from 'web3'; -import { INetworkDetail } from '../../interfaces'; +import { INetworkDetail, NetworkChainCode, NetworkChainId } from '../../interfaces'; // eslint-disable-next-line @typescript-eslint/no-explicit-any declare let window: any; @@ -36,8 +36,8 @@ export class NetworkServiceWeb3Login { } } return { - chainId: '0', - chainCode: 'unknown', + chainId: NetworkChainId.UNKNOWN, + chainCode: NetworkChainCode.UNKNOWN, name: 'Unknown', shortName: 'unknown', nativeCurrency: { @@ -57,8 +57,8 @@ export class NetworkServiceWeb3Login { return networkDetail; } return { - chainId: '0', - chainCode: 'unknown', + chainId: NetworkChainId.UNKNOWN, + chainCode: NetworkChainCode.UNKNOWN, name: 'Unknown', shortName: 'unknown', nativeCurrency: { @@ -72,8 +72,8 @@ export class NetworkServiceWeb3Login { getNetworkDetailList(): INetworkDetail[] { return [ { - chainId: '1', - chainCode: '0x1', + chainId: NetworkChainId.ETHEREUM, + chainCode: NetworkChainCode.ETHEREUM, name: 'Ethereum Mainnet', shortName: 'Ethereum', nativeCurrency: { @@ -83,8 +83,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '56', - chainCode: '0x38', + chainId: NetworkChainId.BNB, + chainCode: NetworkChainCode.BNB, name: 'Binance Smart Chain Mainnet', shortName: 'BNB Chain', nativeCurrency: { @@ -94,8 +94,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '11155111', - chainCode: '0xaa36a7', + chainId: NetworkChainId.SEPOLIA, + chainCode: NetworkChainCode.SEPOLIA, name: 'Sepolia', shortName: 'Sepolia', nativeCurrency: { @@ -105,8 +105,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '42161', - chainCode: '0xa4b1', + chainId: NetworkChainId.ARBITRUM, + chainCode: NetworkChainCode.ARBITRUM, name: 'Arbitrum One', shortName: 'Arbitrum', nativeCurrency: { @@ -116,8 +116,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '137', - chainCode: '0x89', + chainId: NetworkChainId.POLYGON, + chainCode: NetworkChainCode.POLYGON, name: 'Polygon', shortName: 'Polygon', nativeCurrency: { @@ -127,8 +127,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '10', - chainCode: '0xa', + chainId: NetworkChainId.OPTIMISM, + chainCode: NetworkChainCode.OPTIMISM, name: 'Optimism', shortName: 'Optimism', nativeCurrency: { @@ -138,8 +138,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '43114', - chainCode: '0xa86a', + chainId: NetworkChainId.AVALANCHE, + chainCode: NetworkChainCode.AVALANCHE, name: 'Avalanche', shortName: 'Avalanche', nativeCurrency: { @@ -149,8 +149,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '1284', - chainCode: '0x504', + chainId: NetworkChainId.MOONBEAM, + chainCode: NetworkChainCode.MOONBEAM, name: 'Moonbeam', shortName: 'Moonbeam', nativeCurrency: { @@ -160,8 +160,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '222', - chainCode: '0x8ae', + chainId: NetworkChainId.KAVA, + chainCode: NetworkChainCode.KAVA, name: 'KAVA', shortName: 'KAVA', nativeCurrency: { @@ -171,8 +171,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '250', - chainCode: '0xfa', + chainId: NetworkChainId.FANTOM, + chainCode: NetworkChainCode.FANTOM, name: 'Fantom', shortName: 'Fantom', nativeCurrency: { @@ -182,8 +182,8 @@ export class NetworkServiceWeb3Login { } }, { - chainId: '42220', - chainCode: '0xa4ec', + chainId: NetworkChainId.CELO, + chainCode: NetworkChainCode.CELO, name: 'Celo', shortName: 'Celo', nativeCurrency: { @@ -195,13 +195,13 @@ export class NetworkServiceWeb3Login { ]; } - getNetworkName(chainId: string): string { + getNetworkName(chainId: NetworkChainId): string { switch (chainId) { - case '1': + case NetworkChainId.ETHEREUM: return 'Mainnet'; - case '56': + case NetworkChainId.BNB: return 'Binance Smart Chain'; - case '11155111': + case NetworkChainId.SEPOLIA: return 'Sepolia'; default: return 'Unknown'; diff --git a/UI/projects/web3-login/src/lib/services/web3-login/web3-login.service.ts b/UI/projects/web3-login/src/lib/services/web3-login/web3-login.service.ts index 3c969a15..594ebc4f 100644 --- a/UI/projects/web3-login/src/lib/services/web3-login/web3-login.service.ts +++ b/UI/projects/web3-login/src/lib/services/web3-login/web3-login.service.ts @@ -1,7 +1,7 @@ import { EventEmitter, Injectable } from '@angular/core'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { Web3LoginComponent } from '../../containers/web3-login/web3-login.component'; -import { IModalState, INetworkDetail } from '../../interfaces'; +import { IModalState, INetworkDetail, NetworkChainId } from '../../interfaces'; import { NetworkServiceWeb3Login } from '../network/network.service'; import { Observable } from 'rxjs'; @@ -38,7 +38,7 @@ export class Web3LoginService { return this.dialog.closeAll(); } - getNetworkName(chainId: string): string { + getNetworkName(chainId: NetworkChainId): string { return this.networkServiceWeb3Login.getNetworkName(chainId); } diff --git a/UI/src/app/app.component.ts b/UI/src/app/app.component.ts index ed29a65e..50c0b9d4 100644 --- a/UI/src/app/app.component.ts +++ b/UI/src/app/app.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { AnalyticsService } from './shared/services/analytics/analytics.service'; + declare global { interface Window { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.html b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.html index f019f3d4..636c234f 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.html @@ -27,7 +27,14 @@

{{ paymentRequest.profile.username }}

-

{{ paymentRequest.payment.data.amount }} {{ paymentNetwork?.nativeCurrency?.symbol }}

+

+ {{ paymentRequest.payment.data.amount }} {{ paymentNetwork?.nativeCurrency?.symbol }} +

+

+ {{ tokenConversionRate }} {{ paymentNetwork?.nativeCurrency?.symbol }} +
+ (${{ paymentRequest.payment.data.amount }} USD) +

{{ paymentRequest.payment.data.description }}

diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.scss b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.scss index 90446648..7fc1311e 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.scss +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.scss @@ -1,3 +1,8 @@ .card-header-custom { top: -3rem; } + +.conversionValue { + font-size: 0.8rem; + font-weight: 600; +} diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.ts b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.ts index e4bbc95b..11c99d8e 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.ts +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-card/payment-request-card.component.ts @@ -1,8 +1,9 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; -import { INetworkDetail } from '@chainbrary/web3-login'; +import { INetworkDetail, NetworkChainId } from '@chainbrary/web3-login'; import { take } from 'rxjs'; import { AuthStatusCode } from './../../../../../shared/enum'; +import { PriceFeedService } from './../../../../../shared/services/price-feed/price-feed.service'; import { WalletService } from './../../../../../shared/services/wallet/wallet.service'; import { IPaymentRequestState } from './../../../../../store/payment-request-store/state/interfaces'; @@ -11,18 +12,36 @@ import { IPaymentRequestState } from './../../../../../store/payment-request-sto templateUrl: './payment-request-card.component.html', styleUrls: ['./payment-request-card.component.scss'] }) -export class PaymentRequestCardComponent { +export class PaymentRequestCardComponent implements OnInit { AuthStatusCodeTypes = AuthStatusCode; @Input() paymentRequest: IPaymentRequestState; @Input() authStatus: AuthStatusCode; @Input() publicAddress: string | null; @Input() currentNetwork: INetworkDetail | null; @Input() paymentNetwork: INetworkDetail | null; - @Output() openLoginModal = new EventEmitter(); @Output() submitPayment = new EventEmitter<{ priceValue: number }>(); + tokenConversionRate: number; + + constructor( + private snackbar: MatSnackBar, + private walletService: WalletService, + private priceFeedService: PriceFeedService + ) {} - constructor(private snackbar: MatSnackBar, private walletService: WalletService) {} + ngOnInit(): void { + this.setUpCurrentPrice(); + } + + setUpCurrentPrice(): void { + if (this.paymentRequest.payment.data?.usdEnabled as boolean) { + this.priceFeedService + .getCurrentPriceOfNativeToken(this.currentNetwork?.chainId as NetworkChainId) + .then((result: number) => { + this.tokenConversionRate = (this.paymentRequest?.payment?.data?.amount as number) / result; + }); + } + } submitAmount(): void { if (this.authStatus === AuthStatusCode.NotConnected) { @@ -37,10 +56,15 @@ export class PaymentRequestCardComponent { }); return; } - - return this.submitPayment.emit({ - priceValue: (this.paymentRequest.payment.data?.amount as number) * 1e18 - }); + if (this.paymentRequest?.payment?.data?.usdEnabled) { + return this.submitPayment.emit({ + priceValue: this.tokenConversionRate * 1e18 + }); + } else { + return this.submitPayment.emit({ + priceValue: (this.paymentRequest.payment.data?.amount as number) * 1e18 + }); + } }); } } diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.html b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.html index 292f5b17..87dd1d24 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.html @@ -4,7 +4,7 @@
- +
@@ -19,18 +19,24 @@
diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.ts b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.ts index 433c0336..33beb833 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.ts +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-maker/payment-request-maker.component.ts @@ -8,21 +8,22 @@ import { Validators } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; -import { INetworkDetail } from '@chainbrary/web3-login'; +import { INetworkDetail, NetworkChainId } from '@chainbrary/web3-login'; import { Buffer } from 'buffer'; -import { Observable, ReplaySubject, of, take, takeUntil } from 'rxjs'; +import { Observable, ReplaySubject, debounceTime, filter, map, of, startWith, switchMap, take, takeUntil } from 'rxjs'; import { AuthStatusCode } from './../../../../../shared/enum'; import { IPaymentRequest, PaymentMakerForm, PriceSettingsForm, ProfileForm } from './../../../../../shared/interfaces'; +import { PriceFeedService } from './../../../../../shared/services/price-feed/price-feed.service'; import { WalletService } from './../../../../../shared/services/wallet/wallet.service'; @Component({ - selector: 'app-payment-request-maker[publicAddressObs][currentNetwork]', + selector: 'app-payment-request-maker[publicAddressObs][currentNetworkObs]', templateUrl: './payment-request-maker.component.html', styleUrls: ['./payment-request-maker.component.scss'] }) export class PaymentRequestMakerComponent implements OnInit, OnDestroy { @Input() publicAddressObs: Observable; - @Input() currentNetwork: INetworkDetail | null; + @Input() currentNetworkObs: Observable; private destroyed$: ReplaySubject = new ReplaySubject(); AuthStatusCodeTypes = AuthStatusCode; @@ -31,8 +32,15 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { mainForm: FormGroup; linkGenerated: string; isAvatarUrlValid: boolean; + usdConversionRate = 0; + tokenConversionRate = 0; + usdAmount: number | null; - constructor(private snackbar: MatSnackBar, private walletService: WalletService) {} + constructor( + private snackbar: MatSnackBar, + private walletService: WalletService, + private priceFeedService: PriceFeedService + ) {} get priceForm(): FormGroup { return this.mainForm.get('price') as FormGroup; @@ -42,16 +50,55 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { return this.mainForm.get('profile') as FormGroup; } + get amount(): number { + if (this.priceForm?.get('usdEnabled')?.value as boolean) return this.tokenConversionRate; + else return this.priceForm.get('amount')?.value as number; + } + + get avatarValue(): string | null { + return this.profileControls.avatarUrl.value; + } + + get profileControls(): ProfileForm { + return this.mainForm.controls.profile.controls; + } + + get priceControls(): PriceSettingsForm { + return this.mainForm.controls.price.controls; + } + ngOnInit(): void { this.setUpForm(); this.listenToAddressChange(); + this.listenToAmountChange(); + } + + async setUpPriceCurrentPrice(amount: number | null, chainId: NetworkChainId): Promise { + return this.priceFeedService + .getCurrentPriceOfNativeToken(chainId) + .then((result: number) => { + if (!this.mainForm.get('price')?.get('usdEnabled')?.value as boolean) { + if (amount === null) { + this.usdConversionRate = result; + } else { + this.usdConversionRate = result * (amount as number); + } + this.usdAmount = this.usdConversionRate; + } else { + this.tokenConversionRate = (this.priceForm.get('amount')?.value as number) / result; + } + }) + .catch(() => { + this.usdConversionRate = 0; + }); } setUpForm(): void { this.mainForm = new FormGroup({ price: new FormGroup({ description: new FormControl('', []), - amount: new FormControl(1, [Validators.required, Validators.min(0)]) + amount: new FormControl(1, [Validators.required, Validators.min(0)]), + usdEnabled: new FormControl(false, []) }), profile: new FormGroup({ publicAddress: new FormControl('', [Validators.required]), @@ -59,6 +106,41 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { username: new FormControl('', [Validators.required, Validators.maxLength(20)]) }) }); + this.currentNetworkObs + .pipe(filter((network: INetworkDetail | null) => network !== null)) + .subscribe((network: INetworkDetail | null) => { + this.setUpPriceCurrentPrice(1, network?.chainId as NetworkChainId); + }); + } + + listenToAmountChange(): void { + this.priceForm + .get('amount') + ?.valueChanges.pipe( + startWith(this.priceForm.get('amount')?.value || 0), + debounceTime(1000), + filter((amount: number | null) => amount !== null && amount > 0), + switchMap((amount: number | null) => { + return this.currentNetworkObs.pipe( + take(1), + filter( + (currentNetwork: INetworkDetail | null) => currentNetwork !== null && currentNetwork?.chainId !== null + ), + map((currentNetwork: INetworkDetail | null) => { + return { amount: amount, currentNetwork: currentNetwork }; + }) + ); + }), + takeUntil(this.destroyed$) + ) + .subscribe(({ amount, currentNetwork }) => { + this.setUpPriceCurrentPrice(amount, currentNetwork?.chainId as NetworkChainId); + if (this.mainForm.get('price')?.get('usdEnabled')?.value as boolean) { + this.usdAmount = amount as number; + } else { + this.usdAmount = null; + } + }); } listenToAddressChange(): void { @@ -80,7 +162,7 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { } if (this.page === PaymentMakePage.settingPrice) { - const { amount } = this.getPriceControls(); + const { amount } = this.priceControls; if ((amount.value as number) <= 0) { this.snackbar.open('Amount must be greater than 0', 'Close', { duration: 3000 }); return; @@ -105,26 +187,28 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { } generatePaymentRequest(): void { - const { username, publicAddress, avatarUrl } = this.getProfileControls(); - const { amount, description } = this.getPriceControls(); - - const paymentRequest: IPaymentRequest = { - chainId: this.currentNetwork?.chainId as string, - tokenId: '0', - username: username.value as string, - publicAddress: publicAddress.value as string, - amount: amount.value as number, - description: description.value as string, - avatarUrl: avatarUrl.value as string - }; - const paymentRequestBase64: string = Buffer.from(JSON.stringify(paymentRequest), 'utf-8') - .toString('base64') - .replace('+', '-') - .replace('/', '_'); - const url: URL = new URL(window.location.href); - const origin = `${url.protocol}//${url.hostname}${url.port ? ':' + url.port : ''}`; - this.linkGenerated = `${origin}/payment-page/${paymentRequestBase64}`; - return; + const { username, publicAddress, avatarUrl } = this.profileControls; + const { amount, description, usdEnabled } = this.priceControls; + + this.currentNetworkObs.pipe(take(1)).subscribe((network: INetworkDetail | null) => { + const paymentRequest: IPaymentRequest = { + chainId: network?.chainId as NetworkChainId, + tokenId: '0', + username: username.value as string, + publicAddress: publicAddress.value as string, + amount: amount.value as number, + description: description.value as string, + avatarUrl: avatarUrl.value as string, + usdEnabled: usdEnabled.value as boolean + }; + const paymentRequestBase64: string = Buffer.from(JSON.stringify(paymentRequest), 'utf-8') + .toString('base64') + .replace('+', '-') + .replace('/', '_'); + const url: URL = new URL(window.location.href); + const origin = `${url.protocol}//${url.hostname}${url.port ? ':' + url.port : ''}`; + this.linkGenerated = `${origin}/payment-page/${paymentRequestBase64}`; + }); } urlValidator(): AsyncValidatorFn { @@ -152,17 +236,30 @@ export class PaymentRequestMakerComponent implements OnInit, OnDestroy { }; } - getProfileControls(): ProfileForm { - return this.mainForm.controls.profile.controls; - } - - getPriceControls(): PriceSettingsForm { - return this.mainForm.controls.price.controls; - } - - getAvatarValue(): string | null { - const { avatarUrl } = this.getProfileControls(); - return avatarUrl.value; + swapCurrency(): void { + if (!this.priceForm?.get('usdEnabled')?.value as boolean) { + this.priceForm.patchValue({ + amount: this.usdConversionRate, + usdEnabled: true + }); + } else { + this.currentNetworkObs + .pipe( + filter((network: INetworkDetail | null) => network !== null), + map((network: INetworkDetail | null) => network?.chainId as NetworkChainId) + ) + .subscribe((chainId: NetworkChainId) => { + this.priceFeedService + .getCurrentPriceOfNativeToken(chainId) + .then((result: number) => { + this.priceForm.patchValue({ + amount: (this.priceForm.get('amount')?.value as number) / result, + usdEnabled: false + }); + }) + .catch(() => (this.usdConversionRate = 0)); + }); + } } ngOnDestroy(): void { diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.html b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.html index 3651cb92..9e11d5fa 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.html @@ -1,13 +1,24 @@
- - Amount - -
-
{{ networkSymbol }}
-
-
+

+ + Amount + +

+
{{ networkSymbol }}
+
$USD
+
+ + ${{ usdConversionRate }} + + + + {{ tokenConversionRate }} {{ networkSymbol }} + + + +

diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.ts b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.ts index 676c8792..64f1361b 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.ts +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-price-settings/payment-request-price-settings.component.ts @@ -10,6 +10,9 @@ import { PriceSettingsForm } from './../../../../../shared/interfaces'; export class PaymentRequestPriceSettingsComponent { @Input() priceForm: FormGroup; @Input() networkSymbol: string | null; + @Input() usdConversionRate: number | null; + @Input() tokenConversionRate: number | null; @Output() goToNextPage = new EventEmitter(); @Output() goToPreviousPage = new EventEmitter(); + @Output() swapCurrency = new EventEmitter(); } diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.html b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.html index 7bc77d3a..a290b998 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.html @@ -1,24 +1,41 @@
+

+ You're requesting $USD {{ usdAmount }}. +
+ Rest assured, the transaction will be initiated to precisely match this amount, irrespective of any token + volatility. +

- + - - + + - - + + - + diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.scss b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.scss index 53f252e2..d1c6a6d6 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.scss +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.scss @@ -5,3 +5,7 @@ text-decoration: underline; } } + +.convertion-rate { + font-size: 12px; +} diff --git a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.ts b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.ts index 1ab0e8d9..cd448822 100644 --- a/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.ts +++ b/UI/src/app/page/use-cases-page/payment-request/components/payment-request-review/payment-request-review.component.ts @@ -4,28 +4,39 @@ import { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from '@angular/material import { QrCodeContainerModalComponent } from './../../../../../shared/components/modal/qr-code-container-modal/qr-code-container-modal.component'; @Component({ - selector: 'app-payment-request-review[username][amount][previewLink][networkSymbol]', + selector: 'app-payment-request-review[username][amount][previewLink][networkSymbol][usdEnabled]', templateUrl: './payment-request-review.component.html', styleUrls: ['./payment-request-review.component.scss'] }) export class PaymentRequestReviewComponent { @Input() username: string; @Input() amount: number; + @Input() usdAmount: number | null; + @Input() tokenConversionRate: number | null; @Input() previewLink: string; @Input() networkSymbol: string | null; + @Input() usdEnabled: boolean; @Output() goToPreviousPageEvent = new EventEmitter(); protocolFee = 0.001; constructor(private snackbar: MatSnackBar, public dialog: MatDialog) {} get receivingAmount(): number { - return this.amount - this.protocolFee; + return this.amount - this.protocolFeeAmount; } get protocolFeeAmount(): number { return this.amount * this.protocolFee; } + get usdReceivingAmount(): number { + return this.usdAmount ? Number((this.usdAmount - this.usdProtocolFeeAmount).toFixed(2)) : 0; + } + + get usdProtocolFeeAmount(): number { + return this.usdAmount ? Number((this.usdAmount * this.protocolFee).toFixed(2)) : 0; + } + goToPaymentPage(): Window | null { return window.open(this.previewLink, '_blank'); } diff --git a/UI/src/app/page/use-cases-page/payment-request/containers/payment-page/payment-page.component.html b/UI/src/app/page/use-cases-page/payment-request/containers/payment-page/payment-page.component.html index e62815cb..a02744d4 100644 --- a/UI/src/app/page/use-cases-page/payment-request/containers/payment-page/payment-page.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/containers/payment-page/payment-page.component.html @@ -45,6 +45,20 @@

Wrong network

+
+
+

+ {{ (selectPaymentRequestState$ | async)?.profile?.username }} is requesting a sum + equivalent to ${{ (selectPaymentRequestState$ | async)?.payment?.data?.amount }} USD. +
+ To ensure accuracy, the transaction will be precisely calculated to match this amount in + {{ tokenInfo }} prior to processing the payment. +

+
+
; currentNetwork$: Observable; paymentNetwork$: Observable; + nativeTokenInfo: INativeToken; constructor( private route: ActivatedRoute, @@ -58,6 +59,10 @@ export class PaymentPageComponent implements OnInit, OnDestroy { ); } + get tokenInfo(): string { + return `${this.nativeTokenInfo.name} (${this.nativeTokenInfo.symbol})`; + } + setUpId(): Subscription { return this.route.params.subscribe((params: Params) => { if (params['id']) { @@ -68,6 +73,7 @@ export class PaymentPageComponent implements OnInit, OnDestroy { ngOnInit(): void { this.generateObs(); + this.setUpMessage(); } generateObs(): void { @@ -80,6 +86,20 @@ export class PaymentPageComponent implements OnInit, OnDestroy { this.paymentNetwork$ = this.store.select(selectPaymentNetwork); } + setUpMessage(): void { + this.selectPaymentRequestState$ + .pipe( + take(1), + filter((state: IPaymentRequestState) => !!state?.payment?.data?.usdEnabled), + map((state: IPaymentRequestState) => state?.payment?.data as IPaymentRequest), + map((paymentRequest: IPaymentRequest) => paymentRequest as IPaymentRequest) + ) + .subscribe( + (payment: IPaymentRequest) => + (this.nativeTokenInfo = this.web3LoginService.getNetworkDetailByChainId(payment.chainId).nativeCurrency) + ); + } + openLoginModal(): void { this.modalSub = this.web3LoginService.openLoginModal().subscribe((state: IModalState) => { switch (state.type) { @@ -104,7 +124,7 @@ export class PaymentPageComponent implements OnInit, OnDestroy { map((network: INetworkDetail | null) => network as INetworkDetail) ) .subscribe((network: INetworkDetail) => { - if (!environment.networkSupported.includes(network.chainId)) { + if (!environment.contracts.bridgeTransfer.networkSupported.includes(network.chainId)) { this._snackBar.open('Network not supported', 'Close', { duration: 2000 }); diff --git a/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.html b/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.html index 33e79f9d..e831ab58 100644 --- a/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.html +++ b/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.html @@ -8,7 +8,7 @@

Payment Request

- +
diff --git a/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.ts b/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.ts index 321c35da..a1e59941 100644 --- a/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.ts +++ b/UI/src/app/page/use-cases-page/payment-request/containers/payment-request-container/payment-request-container.component.ts @@ -18,7 +18,6 @@ import { styleUrls: ['./payment-request-container.component.scss'] }) export class PaymentRequestContainerComponent implements OnInit { - certifficationCardVisible = true; authStatus$: Observable; AuthStatusCodeTypes = AuthStatusCode; profileAccount$: Observable; @@ -28,10 +27,6 @@ export class PaymentRequestContainerComponent implements OnInit { constructor(private store: Store) {} - hideCertifficationCard(): void { - this.certifficationCardVisible = false; - } - ngOnInit(): void { this.authStatus$ = this.store.select(selectAuthStatus); this.profileAccount$ = this.store.select(selectAccount); diff --git a/UI/src/app/page/use-cases-page/use-cases-page.component.html b/UI/src/app/page/use-cases-page/use-cases-page.component.html index 7c4411b9..e0a3537d 100644 --- a/UI/src/app/page/use-cases-page/use-cases-page.component.html +++ b/UI/src/app/page/use-cases-page/use-cases-page.component.html @@ -9,8 +9,6 @@
- -
diff --git a/UI/src/app/shared/components/transaction-card/transaction-card.component.ts b/UI/src/app/shared/components/transaction-card/transaction-card.component.ts index 415d7a0c..6aaddc00 100644 --- a/UI/src/app/shared/components/transaction-card/transaction-card.component.ts +++ b/UI/src/app/shared/components/transaction-card/transaction-card.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { ITransactionCard } from '../../interfaces'; +import { NetworkChainId } from '@chainbrary/web3-login'; @Component({ selector: 'app-transaction-card[cardContent]', @@ -14,17 +15,23 @@ export class TransactionCardComponent implements OnInit { this.generateScanLink(this.cardContent.chainId); } - generateScanLink(chainId: number): void { + generateScanLink(chainId: NetworkChainId): void { switch (chainId) { - case 1: + case NetworkChainId.ETHEREUM: this.scanLink = `https://etherscan.io/tx/${this.cardContent.hash}`; break; - case 5: - this.scanLink = `https://goerli.etherscan.io/tx/${this.cardContent.hash}`; - break; - case 11155111: + case NetworkChainId.SEPOLIA: this.scanLink = `https://sepolia.etherscan.io/tx/${this.cardContent.hash}`; break; + case NetworkChainId.POLYGON: + this.scanLink = `https://polygonscan.com/tx/${this.cardContent.hash}`; + break; + case NetworkChainId.BNB: + this.scanLink = `https://bscscan.com/tx/${this.cardContent.hash}`; + break; + case NetworkChainId.AVALANCHE: + this.scanLink = `https://snowtrace.io/tx/${this.cardContent.hash}`; + break; } } diff --git a/UI/src/app/shared/components/use-cases-sidebar-header/use-cases-sidebar-header.component.ts b/UI/src/app/shared/components/use-cases-sidebar-header/use-cases-sidebar-header.component.ts index 7bf94af6..f10547d4 100644 --- a/UI/src/app/shared/components/use-cases-sidebar-header/use-cases-sidebar-header.component.ts +++ b/UI/src/app/shared/components/use-cases-sidebar-header/use-cases-sidebar-header.component.ts @@ -39,7 +39,7 @@ export class UseCasesSidebarHeaderComponent implements OnInit, OnDestroy { networkSetUp(): void { this.networkList = this.web3LoginService .getNetworkDetailList() - .filter(({ chainId }: INetworkDetail) => environment.networkSupported.includes(chainId)); + .filter(({ chainId }: INetworkDetail) => environment.contracts.bridgeTransfer.networkSupported.includes(chainId)); } generateObs(): void { diff --git a/UI/src/app/shared/contracts/index.ts b/UI/src/app/shared/contracts/index.ts index de248b32..38c5532f 100644 --- a/UI/src/app/shared/contracts/index.ts +++ b/UI/src/app/shared/contracts/index.ts @@ -1,2 +1,3 @@ export * from './organizationContract'; export * from './transactionBridgeContract'; +export * from './priceFeedContract'; diff --git a/UI/src/app/shared/contracts/organizationContract.ts b/UI/src/app/shared/contracts/organizationContract.ts index 896c1c92..5c058108 100644 --- a/UI/src/app/shared/contracts/organizationContract.ts +++ b/UI/src/app/shared/contracts/organizationContract.ts @@ -9,7 +9,7 @@ export class OrganizationContract extends BaseContract { } getAddress(): string { - const contractLink: IContract = environment.contracts.bridgeTransfer.find( + const contractLink: IContract = environment.contracts.bridgeTransfer.contracts.find( (contract: IContract) => this.chainId === contract.chainId ) as IContract; return contractLink.address; diff --git a/UI/src/app/shared/contracts/priceFeedContract.ts b/UI/src/app/shared/contracts/priceFeedContract.ts new file mode 100644 index 00000000..cde8c461 --- /dev/null +++ b/UI/src/app/shared/contracts/priceFeedContract.ts @@ -0,0 +1,97 @@ +import { AbiItem } from 'web3-utils'; +import { environment } from '../../../environments/environment'; +import { IContract } from '../interfaces'; +import { BaseContract } from './baseContract'; +import { TokenPair } from '../enum'; +import { NetworkChainId } from '@chainbrary/web3-login'; + +export class PriceFeedContract extends BaseContract { + PRICE_FEED_DATA: IPriceFeedData = { + [NetworkChainId.SEPOLIA]: [ + { + pair: TokenPair.EthToUsd, + address: '0x694AA1769357215DE4FAC081bf1f309aDC325306' + }, + { + pair: TokenPair.BtcToUsd, + address: '0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43' + } + ] + }; + + constructor(public chainId: NetworkChainId, public pair: TokenPair) { + super(); + } + + getPairAddress(): string | void { + const addressList: IPriceFeedPair[] = this.PRICE_FEED_DATA[this.chainId]; + + if (!addressList) return; + + const addressObj = addressList.find((a: IPriceFeedPair) => a.pair === this.pair); + + if (!addressObj) return; + + return addressObj.address; + } + + getAddress(): string { + const contractLink: IContract = environment.contracts.priceFeed.contracts.find( + (contract: IContract) => this.chainId === contract.chainId + ) as IContract; + return contractLink.address; + } + + getAbi(): AbiItem[] { + return [ + { + inputs: [ + { + internalType: 'address', + name: 'aggregator', + type: 'address' + } + ], + name: 'getLatestDataFrom', + outputs: [ + { + internalType: 'uint80', + name: 'roundId', + type: 'uint80' + }, + { + internalType: 'int256', + name: 'answer', + type: 'int256' + }, + { + internalType: 'uint256', + name: 'startedAt', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'updatedAt', + type: 'uint256' + }, + { + internalType: 'uint80', + name: 'answeredInRound', + type: 'uint80' + } + ], + stateMutability: 'view', + type: 'function' + } + ]; + } +} + +interface IPriceFeedData { + [chainId: string]: IPriceFeedPair[]; +} + +interface IPriceFeedPair { + pair: TokenPair; + address: string; +} diff --git a/UI/src/app/shared/contracts/transactionBridgeContract.ts b/UI/src/app/shared/contracts/transactionBridgeContract.ts index 9999cc99..d1c58b1c 100644 --- a/UI/src/app/shared/contracts/transactionBridgeContract.ts +++ b/UI/src/app/shared/contracts/transactionBridgeContract.ts @@ -9,7 +9,7 @@ export class TransactionBridgeContract extends BaseContract { } getAddress(): string { - const contractLink: IContract = environment.contracts.bridgeTransfer.find( + const contractLink: IContract = environment.contracts.bridgeTransfer.contracts.find( (contract: IContract) => this.chainId === contract.chainId ) as IContract; return contractLink.address; diff --git a/UI/src/app/shared/enum/index.ts b/UI/src/app/shared/enum/index.ts index 504c4b63..802814b2 100644 --- a/UI/src/app/shared/enum/index.ts +++ b/UI/src/app/shared/enum/index.ts @@ -1 +1,2 @@ export * from './auth-status-code'; +export * from './token-pair'; diff --git a/UI/src/app/shared/enum/token-pair.ts b/UI/src/app/shared/enum/token-pair.ts new file mode 100644 index 00000000..83e07391 --- /dev/null +++ b/UI/src/app/shared/enum/token-pair.ts @@ -0,0 +1,4 @@ +export enum TokenPair { + EthToUsd, + BtcToUsd +} diff --git a/UI/src/app/shared/interfaces/payment.interface.ts b/UI/src/app/shared/interfaces/payment.interface.ts index 83180525..d1ff7e1b 100644 --- a/UI/src/app/shared/interfaces/payment.interface.ts +++ b/UI/src/app/shared/interfaces/payment.interface.ts @@ -1,18 +1,21 @@ import { FormControl, FormGroup } from '@angular/forms'; +import { NetworkChainId } from '@chainbrary/web3-login'; export interface IPaymentRequest { - chainId: string; + chainId: NetworkChainId; tokenId: string; publicAddress: string; username: string; amount: number; description: string | null; avatarUrl: string; + usdEnabled: boolean; } export interface PriceSettingsForm { description: FormControl; amount: FormControl; + usdEnabled: FormControl; } export interface ProfileForm { diff --git a/UI/src/app/shared/interfaces/token.interface.ts b/UI/src/app/shared/interfaces/token.interface.ts index 71f447a7..94c6948a 100644 --- a/UI/src/app/shared/interfaces/token.interface.ts +++ b/UI/src/app/shared/interfaces/token.interface.ts @@ -12,50 +12,8 @@ export interface IContract { address: string; } -export enum ChainId { - MAINNET = 1, - ROPSTEN = 3, - RINKEBY = 4, - GÖRLI = 5, - KOVAN = 42, - BSC = 56, - BSC_TESTNET = 97, - MATIC = 137, - MATIC_TESTNET = 80001, - XDAI = 100, - FANTOM = 250, - FANTOM_TESTNET = 4002, - MOONBEAM_TESTNET = 1287, - AVALANCHE = 43114, - AVALANCHE_TESTNET = 43113, - FUJI = 43113, - HECO = 128, - HECO_TESTNET = 256, - HARMONY = 1666600000, - HARMONY_TESTNET = 1666700000, - OKEX = 66, - OKEX_TESTNET = 65, - CELO = 42220, - PALM = 11297108109, - MUMBAI = 80001, - ARBITRUM = 42161, - ARBITRUM_TESTNET = 79377087078960 -} - -export enum Network { - MAINNET = 'mainnet', - ROPSTEN = 'ropsten', - RINKEBY = 'rinkeby', - GÖRLI = 'goerli', - KOVAN = 'kovan', - BSC = 'bsc', - BSC_TESTNET = 'bsc-testnet', - MATIC = 'matic', - MATIC_TESTNET = 'matic-testnet', - XDAI = 'xdai', - FANTOM = 'fantom', - FANTOM_TESTNET = 'fantom-testnet', - MOONBEAM_TESTNET = 'moonbeam-testnet', - AVALANCHE = 'avalanche', - AVALANCHE_TESTNET = 'avalanche-testnet' +export interface INativeToken { + decimals: number; + name: string; + symbol: string; } diff --git a/UI/src/app/shared/interfaces/transaction-card.interface.ts b/UI/src/app/shared/interfaces/transaction-card.interface.ts index 07613253..a69422bc 100644 --- a/UI/src/app/shared/interfaces/transaction-card.interface.ts +++ b/UI/src/app/shared/interfaces/transaction-card.interface.ts @@ -1,7 +1,9 @@ +import { NetworkChainId } from '@chainbrary/web3-login'; + export interface ITransactionCard { title: string; type: 'success' | 'danger'; hash: string; component: string; - chainId: number; + chainId: NetworkChainId; } diff --git a/UI/src/app/shared/services/price-feed/price-feed.service.spec.ts b/UI/src/app/shared/services/price-feed/price-feed.service.spec.ts new file mode 100644 index 00000000..7d134fff --- /dev/null +++ b/UI/src/app/shared/services/price-feed/price-feed.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { PriceFeedService } from './price-feed.service'; + +describe('PriceFeedService', () => { + let service: PriceFeedService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(PriceFeedService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/UI/src/app/shared/services/price-feed/price-feed.service.ts b/UI/src/app/shared/services/price-feed/price-feed.service.ts new file mode 100644 index 00000000..b2b660e5 --- /dev/null +++ b/UI/src/app/shared/services/price-feed/price-feed.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import Web3 from 'web3'; +import { Contract } from 'web3-eth-contract'; +import { PriceFeedContract } from '../../contracts'; +import { TokenPair } from '../../enum'; +import { NetworkChainId } from '@chainbrary/web3-login'; + +@Injectable({ + providedIn: 'root' +}) +export class PriceFeedService { + async getCurrentPrice(pair: TokenPair, chainId: NetworkChainId): Promise { + const web3: Web3 = new Web3(window.ethereum); + const transactionContract = new PriceFeedContract(chainId, pair); + + if (!transactionContract.getPairAddress()) { + return Promise.reject('Pair not found'); + } + + const contract: Contract = new web3.eth.Contract(transactionContract.getAbi(), transactionContract.getAddress()); + + return contract.methods + .getLatestDataFrom(transactionContract.getPairAddress()) + .call() + .then((result: { answer: string; startedAt: string }) => { + const convertedNum = Number(result.answer) / Math.pow(10, 8); + return convertedNum.toFixed(2); + }); + } + + getCurrentPriceOfNativeToken(chainId: NetworkChainId): Promise { + let pair: TokenPair; + switch (chainId) { + case NetworkChainId.SEPOLIA: + pair = TokenPair.EthToUsd; + break; + default: + return Promise.reject('Pair not found'); + } + + return this.getCurrentPrice(pair, chainId); + } +} diff --git a/UI/src/app/store/payment-request-store/state/actions.ts b/UI/src/app/store/payment-request-store/state/actions.ts index f4417ea7..989141b2 100644 --- a/UI/src/app/store/payment-request-store/state/actions.ts +++ b/UI/src/app/store/payment-request-store/state/actions.ts @@ -1,4 +1,4 @@ -import { INetworkDetail } from '@chainbrary/web3-login'; +import { INetworkDetail, NetworkChainId } from '@chainbrary/web3-login'; import { createAction, props } from '@ngrx/store'; import { IPaymentRequest, IProfileAdded } from './../../../shared/interfaces'; @@ -31,7 +31,10 @@ export const sendAmount = createAction('[Payment Request] Send Amount Transactio export const sendAmountCompleted = createAction('[Payment Request] Send Amount Transactions Completed'); -export const amountSent = createAction('[Payment Request] Amount Sent', props<{ hash: string; chainId: number }>()); +export const amountSent = createAction( + '[Payment Request] Amount Sent', + props<{ hash: string; chainId: NetworkChainId }>() +); export const amountSentSuccess = createAction( '[Payment Request] Amount Sent Success', diff --git a/UI/src/app/store/payment-request-store/state/effects.ts b/UI/src/app/store/payment-request-store/state/effects.ts index 56fe7f4f..347adda8 100644 --- a/UI/src/app/store/payment-request-store/state/effects.ts +++ b/UI/src/app/store/payment-request-store/state/effects.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Web3LoginService } from '@chainbrary/web3-login'; +import { NetworkChainId, Web3LoginService } from '@chainbrary/web3-login'; import { Actions, concatLatestFrom, createEffect, ofType } from '@ngrx/effects'; import { Buffer } from 'buffer'; import { Observable, catchError, filter, from, map, of, switchMap } from 'rxjs'; @@ -97,7 +97,7 @@ export class PaymentRequestEffects { map((receipt: IReceiptTransaction) => PaymentRequestActions.amountSent({ hash: receipt.transactionHash, - chainId: Number(payload[2]?.chainId) + chainId: payload[2]?.chainId as NetworkChainId }) ), catchError((error: Error) => of(PaymentRequestActions.amountSentFailure({ message: error.message }))) diff --git a/UI/src/app/store/transaction-store/state/effects.ts b/UI/src/app/store/transaction-store/state/effects.ts index 7b0d4894..ddda1f1f 100644 --- a/UI/src/app/store/transaction-store/state/effects.ts +++ b/UI/src/app/store/transaction-store/state/effects.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { NetworkChainId } from '@chainbrary/web3-login'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { map } from 'rxjs'; import { amountSent } from '../../payment-request-store/state/actions'; @@ -11,7 +12,7 @@ export class TransactionEffects { paymentTransactionSent$ = createEffect(() => { return this.actions$.pipe( ofType(amountSent), - map((action: { hash: string; chainId: number }) => { + map((action: { hash: string; chainId: NetworkChainId }) => { return localTransactionSentSuccessfully({ card: { title: 'Transaction sent successfully', diff --git a/UI/src/environments/environment.development.ts b/UI/src/environments/environment.development.ts index 1d89e634..bb74c0d6 100644 --- a/UI/src/environments/environment.development.ts +++ b/UI/src/environments/environment.development.ts @@ -1,31 +1,50 @@ +import { NetworkChainId } from '@chainbrary/web3-login'; + export const environment = { environmentName: 'development', certificationUri: 'https://api.studio.thegraph.com/query/43513/organizationschainbrary/v0.0.4', contracts: { - bridgeTransfer: [ - { - chainId: '11155111', - address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' - }, - { - chainId: '137', - address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' - }, - { - chainId: '56', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '1', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '43114', - address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' - } - ] + bridgeTransfer: { + networkSupported: [ + NetworkChainId.POLYGON, + NetworkChainId.BNB, + NetworkChainId.SEPOLIA, + NetworkChainId.ETHEREUM, + NetworkChainId.AVALANCHE + ], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' + }, + { + chainId: NetworkChainId.POLYGON, + address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' + }, + { + chainId: NetworkChainId.BNB, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.ETHEREUM, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.AVALANCHE, + address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' + } + ] + }, + priceFeed: { + networkSupported: [NetworkChainId.SEPOLIA], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0x8E34a012E4B3f7065F1c2022ed889eE843350D98' + } + ] + } }, organizationName: 'chainbrary0', - networkSupported: ['137', '56', '11155111', '1', '43114'], gtagId: '' }; diff --git a/UI/src/environments/environment.test.ts b/UI/src/environments/environment.test.ts index d8745bdd..323e6a6b 100644 --- a/UI/src/environments/environment.test.ts +++ b/UI/src/environments/environment.test.ts @@ -1,31 +1,50 @@ +import { NetworkChainId } from '@chainbrary/web3-login'; + export const environment = { environmentName: 'test', certificationUri: 'https://api.studio.thegraph.com/query/43513/organizationschainbrary/v0.0.4', contracts: { - bridgeTransfer: [ - { - chainId: '11155111', - address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' - }, - { - chainId: '137', - address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' - }, - { - chainId: '56', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '1', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '43114', - address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' - } - ] + bridgeTransfer: { + networkSupported: [ + NetworkChainId.POLYGON, + NetworkChainId.BNB, + NetworkChainId.SEPOLIA, + NetworkChainId.ETHEREUM, + NetworkChainId.AVALANCHE + ], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' + }, + { + chainId: NetworkChainId.POLYGON, + address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' + }, + { + chainId: NetworkChainId.BNB, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.ETHEREUM, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.AVALANCHE, + address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' + } + ] + }, + priceFeed: { + networkSupported: [NetworkChainId.SEPOLIA], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0x8E34a012E4B3f7065F1c2022ed889eE843350D98' + } + ] + } }, organizationName: 'chainbrary0', - networkSupported: ['137', '56', '11155111', '1', '43114'], gtagId: 'G-5GWCMSZWW7' }; diff --git a/UI/src/environments/environment.ts b/UI/src/environments/environment.ts index 82c7a31f..9aa3dbcd 100644 --- a/UI/src/environments/environment.ts +++ b/UI/src/environments/environment.ts @@ -1,31 +1,50 @@ +import { NetworkChainId } from '@chainbrary/web3-login'; + export const environment = { environmentName: 'production', certificationUri: 'https://api.studio.thegraph.com/query/43513/organizationschainbrary/v0.0.4', contracts: { - bridgeTransfer: [ - { - chainId: '11155111', - address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' - }, - { - chainId: '137', - address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' - }, - { - chainId: '56', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '1', - address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' - }, - { - chainId: '43114', - address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' - } - ] + bridgeTransfer: { + networkSupported: [ + NetworkChainId.POLYGON, + NetworkChainId.BNB, + NetworkChainId.SEPOLIA, + NetworkChainId.ETHEREUM, + NetworkChainId.AVALANCHE + ], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0xAF19dc1D220774B8D267387Ca2d3E2d452294B81' + }, + { + chainId: NetworkChainId.POLYGON, + address: '0x537339ca0A52A79CD1509eE340113a10B25AB2B0' + }, + { + chainId: NetworkChainId.BNB, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.ETHEREUM, + address: '0xB314575eF85E7Cec0401c79A7b989c011aeC04f4' + }, + { + chainId: NetworkChainId.AVALANCHE, + address: '0xC959D6388058a326c59508e2beAB8Be12de4E0C3' + } + ] + }, + priceFeed: { + networkSupported: [NetworkChainId.SEPOLIA], + contracts: [ + { + chainId: NetworkChainId.SEPOLIA, + address: '0x8E34a012E4B3f7065F1c2022ed889eE843350D98' + } + ] + } }, organizationName: 'chainbrary0', - networkSupported: ['137', '56', '11155111', '1', '43114'], gtagId: 'G-PDSWHFJSN0' };
AccountAccount {{ username }}
Payment{{ amount }} {{ networkSymbol }}Payment + {{ amount }} {{ networkSymbol }}
+ ($USD {{ usdAmount }}) +
Protocol Fee (0.1%){{ protocolFeeAmount }} {{ networkSymbol }}Protocol Fee (0.1%) + {{ protocolFeeAmount }} {{ networkSymbol }}
+ ($USD {{ usdProtocolFeeAmount }}) +
Receiving AmountReceiving Amount - {{ receivingAmount }} {{ networkSymbol }} + + {{ receivingAmount }} {{ networkSymbol }} +
+ (USD$ {{ usdReceivingAmount }}) +