@huma-finance/widgets 0.0.31 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.env.example +2 -2
  2. package/.eslintignore +2 -2
  3. package/.eslintrc.js +64 -64
  4. package/.prettierignore +4 -4
  5. package/.prettierrc.js +16 -16
  6. package/API.md +332 -332
  7. package/LICENSE +660 -660
  8. package/README.md +48 -48
  9. package/babel.config.js +15 -15
  10. package/config-overrides.js +9 -9
  11. package/cosmos.config.json +7 -7
  12. package/cypress/e2e/01-invoice-factoring-borrow.test.ts +62 -62
  13. package/cypress/support/e2e.ts +76 -76
  14. package/cypress/support/ethereum.ts +142 -142
  15. package/cypress/tsconfig.json +9 -9
  16. package/cypress/utils/index.ts +54 -54
  17. package/cypress.config.ts +20 -20
  18. package/dist/cjs/index.cjs +1026 -296
  19. package/dist/cjs/index.cjs.map +1 -1
  20. package/dist/index.d.ts +193 -193
  21. package/dist/index.js +1028 -299
  22. package/dist/index.js.map +1 -1
  23. package/jsdoc2md.json +20 -20
  24. package/package.json +4 -4
  25. package/public/index.html +40 -40
  26. package/public/manifest.json +25 -25
  27. package/public/robots.txt +3 -3
  28. package/rollup.config.js +81 -81
  29. package/src/components/Activity.tsx +132 -132
  30. package/src/components/ApolloWrapper.tsx +15 -15
  31. package/src/components/ApproveAllowanceModal.tsx +121 -121
  32. package/src/components/BottomButton.tsx +33 -33
  33. package/src/components/ChainNotSupportedModal.tsx +33 -33
  34. package/src/components/ChooseAmountModal.tsx +322 -322
  35. package/src/components/ConfirmTransferModal.tsx +153 -153
  36. package/src/components/CreditLine/borrow/1-Evaluation.tsx +157 -157
  37. package/src/components/CreditLine/borrow/2-ChooseAmount.tsx +68 -68
  38. package/src/components/CreditLine/borrow/3-Transfer.tsx +44 -44
  39. package/src/components/CreditLine/borrow/4-ApproveAllowance.tsx +29 -29
  40. package/src/components/CreditLine/borrow/5-Success.tsx +38 -30
  41. package/src/components/CreditLine/borrow/6-Notifications.tsx +10 -0
  42. package/src/components/CreditLine/borrow/index.tsx +136 -117
  43. package/src/components/CreditLine/payment/1-ChooseAmount.tsx +67 -67
  44. package/src/components/CreditLine/payment/2-ApproveAllowance.tsx +23 -23
  45. package/src/components/CreditLine/payment/3-Transfer.tsx +34 -34
  46. package/src/components/CreditLine/payment/4-Success.tsx +39 -39
  47. package/src/components/CreditLine/payment/index.tsx +94 -94
  48. package/src/components/ErrorModal.tsx +132 -132
  49. package/src/components/Factoring/FactoredList.tsx +143 -143
  50. package/src/components/Factoring/UpcomingList.tsx +90 -90
  51. package/src/components/Factoring/index.ts +2 -2
  52. package/src/components/HumaLoading.tsx +68 -68
  53. package/src/components/HumaSnackBar.tsx +60 -0
  54. package/src/components/HumaTable.tsx +158 -158
  55. package/src/components/InvoiceFactoring/borrow/1-Evaluation.tsx +49 -49
  56. package/src/components/InvoiceFactoring/borrow/2-ChooseAmount.tsx +88 -88
  57. package/src/components/InvoiceFactoring/borrow/3-ConfirmTransfer.tsx +37 -37
  58. package/src/components/InvoiceFactoring/borrow/4-ApproveNFT.tsx +55 -55
  59. package/src/components/InvoiceFactoring/borrow/5-Transfer.tsx +34 -34
  60. package/src/components/InvoiceFactoring/borrow/6-Success.tsx +20 -20
  61. package/src/components/InvoiceFactoring/borrow/index.tsx +94 -94
  62. package/src/components/InvoiceFactoring/payment/1-ChooseAmount.tsx +67 -67
  63. package/src/components/InvoiceFactoring/payment/2-ApproveAllowance.tsx +23 -23
  64. package/src/components/InvoiceFactoring/payment/3-Transfer.tsx +34 -34
  65. package/src/components/InvoiceFactoring/payment/4-Success.tsx +23 -23
  66. package/src/components/InvoiceFactoring/payment/index.tsx +86 -86
  67. package/src/components/Lend/supply/1-Evaluation/EvaluationEA.tsx +86 -0
  68. package/src/components/Lend/supply/1-Evaluation/EvaluationKYC.tsx +287 -0
  69. package/src/components/Lend/supply/1-Evaluation/index.tsx +31 -0
  70. package/src/components/Lend/supply/2-ChooseAmount.tsx +69 -70
  71. package/src/components/Lend/supply/3-ApproveAllowance.tsx +25 -25
  72. package/src/components/Lend/supply/{6-Transfer.tsx → 4-Transfer.tsx} +32 -32
  73. package/src/components/Lend/supply/{7-Success.tsx → 5-Success.tsx} +60 -49
  74. package/src/components/Lend/supply/6-Notifications.tsx +10 -0
  75. package/src/components/Lend/supply/index.tsx +167 -144
  76. package/src/components/Lend/withdraw/1-CheckWithdrawble.tsx +73 -73
  77. package/src/components/Lend/withdraw/2-ChooseAmount.tsx +50 -50
  78. package/src/components/Lend/withdraw/3-Transfer.tsx +32 -32
  79. package/src/components/Lend/withdraw/4-Success.tsx +49 -49
  80. package/src/components/Lend/withdraw/index.tsx +101 -101
  81. package/src/components/LoadingModal.tsx +49 -49
  82. package/src/components/Notifi/NotifiSubscriptionModal.tsx +264 -0
  83. package/src/components/StreamFactoring/borrow/1-Evaluation.tsx +55 -55
  84. package/src/components/StreamFactoring/borrow/2-ChooseAmount.tsx +127 -127
  85. package/src/components/StreamFactoring/borrow/3-ConfirmTransfer.tsx +42 -42
  86. package/src/components/StreamFactoring/borrow/4-ApproveAllowance.tsx +33 -33
  87. package/src/components/StreamFactoring/borrow/5-Permit.tsx +144 -144
  88. package/src/components/StreamFactoring/borrow/6-Transfer.tsx +37 -37
  89. package/src/components/StreamFactoring/borrow/7-Success.tsx +20 -20
  90. package/src/components/StreamFactoring/borrow/index.tsx +94 -94
  91. package/src/components/StreamFactoring/payment/ChooseAmount.tsx +54 -54
  92. package/src/components/StreamFactoring/payment/Success.tsx +23 -23
  93. package/src/components/StreamFactoring/payment/Transfer.tsx +34 -34
  94. package/src/components/StreamFactoring/payment/index.tsx +66 -66
  95. package/src/components/SuperfluidFactoring/SuperfluidFactoredList.tsx +70 -70
  96. package/src/components/SuperfluidFactoring/SuperfluidUpcomingList.tsx +167 -167
  97. package/src/components/SuperfluidFactoring/index.tsx +85 -85
  98. package/src/components/TxDoneModal.tsx +85 -83
  99. package/src/components/TxSendModal.tsx +59 -59
  100. package/src/components/ViewOnExplorer.tsx +26 -26
  101. package/src/components/WidgetWrapper.tsx +74 -74
  102. package/src/components/WrapperModal.tsx +54 -54
  103. package/src/components/buttons/TableActionButton.tsx +36 -36
  104. package/src/components/buttons/index.ts +1 -1
  105. package/src/components/humaModal/HumaModal.tsx +68 -68
  106. package/src/components/humaModal/HumaModalHeader.tsx +70 -70
  107. package/src/components/humaModal/index.tsx +2 -2
  108. package/src/components/icons/approve-lender.svg +30 -30
  109. package/src/components/icons/auto-payback.svg +40 -40
  110. package/src/components/icons/check-circle.svg +3 -3
  111. package/src/components/icons/check-green.svg +3 -3
  112. package/src/components/icons/check.svg +10 -10
  113. package/src/components/icons/donut.svg +904 -904
  114. package/src/components/icons/ellipse.svg +3 -3
  115. package/src/components/icons/huma-full.svg +22 -22
  116. package/src/components/icons/huma.svg +15 -15
  117. package/src/components/icons/index.tsx +93 -93
  118. package/src/components/icons/loader.svg +229 -229
  119. package/src/components/icons/metamask.svg +31 -31
  120. package/src/components/icons/polygon.svg +16 -16
  121. package/src/components/icons/receipt.svg +3 -3
  122. package/src/components/icons/separator.svg +3 -3
  123. package/src/components/icons/sorry.svg +31 -31
  124. package/src/components/icons/usdc.svg +5 -5
  125. package/src/components/icons/wallet-connect.svg +11 -11
  126. package/src/cosmos/CreditLineBorrow.fixture.tsx +86 -86
  127. package/src/cosmos/CreditLinePayment.fixture.tsx +50 -50
  128. package/src/cosmos/InvoiceFactoringBorrow.fixture.tsx +111 -111
  129. package/src/cosmos/InvoiceFactoringPayment.fixture.tsx +67 -67
  130. package/src/cosmos/LendSupply.fixture.tsx +75 -75
  131. package/src/cosmos/LendWithdraw.fixture.tsx +43 -43
  132. package/src/cosmos/SDKTesting.fixture.tsx +616 -616
  133. package/src/cosmos/SuperfluidFactoringBorrow.fixture.tsx +15 -15
  134. package/src/cosmos/WalletWrapper.tsx +52 -52
  135. package/src/cosmos/abis/InvoiceNFT.json +644 -644
  136. package/src/cosmos/abis/ReceivableFactoringPool.json +1529 -1529
  137. package/src/cosmos/utils/env.ts +6 -6
  138. package/src/cosmos/utils/index.ts +169 -169
  139. package/src/fonts/Recoleta/Recoleta-Black.otf +0 -0
  140. package/src/fonts/Recoleta/Recoleta-Bold.otf +0 -0
  141. package/src/fonts/Recoleta/Recoleta-Light.otf +0 -0
  142. package/src/fonts/Recoleta/Recoleta-Medium.otf +0 -0
  143. package/src/fonts/Recoleta/Recoleta-Regular.otf +0 -0
  144. package/src/fonts/Recoleta/Recoleta-RegularDEMO.otf +0 -0
  145. package/src/fonts/Recoleta/Recoleta-SemiBold.otf +0 -0
  146. package/src/fonts/Recoleta/Recoleta-Thin.otf +0 -0
  147. package/src/hooks/useEA.ts +53 -53
  148. package/src/hooks/useNotifi.ts +71 -0
  149. package/src/hooks/useRedux.ts +6 -6
  150. package/src/index.css +61 -61
  151. package/src/index.tsx +301 -301
  152. package/src/react-app-env.d.ts +1 -1
  153. package/src/reportWebVitals.ts +15 -15
  154. package/src/setupTests.ts +6 -6
  155. package/src/store/index.ts +27 -27
  156. package/src/store/widgets.reducers.ts +120 -120
  157. package/src/store/widgets.selectors.ts +3 -3
  158. package/src/store/widgets.store.ts +55 -54
  159. package/src/theme/breakpoints.ts +10 -10
  160. package/src/theme/components.ts +70 -70
  161. package/src/theme/coreThemeConstants.ts +29 -29
  162. package/src/theme/cssMixins.ts +92 -92
  163. package/src/theme/hooks/useGetSizes.ts +31 -31
  164. package/src/theme/index.ts +24 -24
  165. package/src/theme/palette.ts +150 -150
  166. package/src/theme/shape.ts +7 -7
  167. package/src/theme/theme.types.ts +80 -80
  168. package/src/theme/typography.ts +117 -117
  169. package/src/utilTypes.d.ts +31 -31
  170. package/src/utils/env.ts +10 -10
  171. package/tsconfig.build.json +7 -7
  172. package/tsconfig.json +32 -32
  173. package/webpack.cosmos.js +54 -54
  174. package/src/components/Lend/supply/1-Evaluation.tsx +0 -175
  175. package/src/components/Lend/supply/4-ConfirmTransfer.tsx +0 -104
  176. package/src/components/NotifiSubscriptionModal.tsx +0 -84
@@ -1,6 +1,6 @@
1
- // @ts-nocheck
2
-
3
- export const initEnv = () => {
4
- window.REACT_APP_FORCE_DEV_PREFIX_FOR_URLS =
5
- process.env.REACT_APP_FORCE_DEV_PREFIX_FOR_URLS
6
- }
1
+ // @ts-nocheck
2
+
3
+ export const initEnv = () => {
4
+ window.REACT_APP_FORCE_DEV_PREFIX_FOR_URLS =
5
+ process.env.REACT_APP_FORCE_DEV_PREFIX_FOR_URLS
6
+ }
@@ -1,169 +1,169 @@
1
- /* eslint-disable arrow-body-style */
2
- /* eslint-disable @typescript-eslint/lines-between-class-members */
3
- /* eslint-disable prefer-destructuring */
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
- /* eslint-disable consistent-return */
6
- /**
7
- * Updates cy.visit() to include an injected window.ethereum provider.
8
- */
9
- import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
10
- import { JsonRpcProvider } from '@ethersproject/providers'
11
- import { ethers, Wallet } from 'ethers'
12
- import { deepCopy } from 'ethers/lib/utils'
13
-
14
- export enum ChainEnum {
15
- Goerli = 5,
16
- Mumbai = 80001,
17
- }
18
-
19
- class MetamaskBridge extends Eip1193Bridge {
20
- private walletAddress: string
21
- private chainId: number
22
-
23
- constructor(
24
- signer: ethers.Signer,
25
- provider: ethers.providers.Provider,
26
- walletAddress: string,
27
- chainId = 5,
28
- ) {
29
- super(signer, provider)
30
- this.walletAddress = walletAddress
31
- this.chainId = chainId
32
- }
33
-
34
- async sendAsync(...args: any[]) {
35
- console.debug('sendAsync called', ...args)
36
- return this.send(...args)
37
- }
38
- async send(...args: any[]) {
39
- console.debug('send called', ...args)
40
- const isCallbackForm =
41
- typeof args[0] === 'object' && typeof args[1] === 'function'
42
- let callback
43
- let method
44
- let params
45
- if (isCallbackForm) {
46
- callback = args[1]
47
- method = args[0].method
48
- params = args[0].params
49
- } else {
50
- method = args[0]
51
- params = args[1]
52
- }
53
- if (method === 'eth_requestAccounts' || method === 'eth_accounts') {
54
- if (isCallbackForm) {
55
- callback({ result: [this.walletAddress] })
56
- } else {
57
- return Promise.resolve([this.walletAddress])
58
- }
59
- }
60
- if (method === 'eth_chainId') {
61
- const chainIdHex = ethers.utils.hexlify(this.chainId)
62
- if (isCallbackForm) {
63
- callback(null, { result: chainIdHex })
64
- } else {
65
- return Promise.resolve(chainIdHex)
66
- }
67
- }
68
- // Eip1193Bridge only supports eth_sign
69
- // address is the first param for eth_sign
70
- if (method === 'personal_sign') {
71
- method = 'eth_sign'
72
- const [data, address] = deepCopy(params)
73
- params[0] = address
74
- params[1] = data
75
- }
76
- try {
77
- // Please refer to: https://github.com/ethers-io/ethers.js/issues/1683
78
- // If from is present on eth_call it errors, removing it makes the library set
79
- // from as the connected wallet which works fine
80
- if (params && params.length && method === 'eth_call') {
81
- if (params[0].from) {
82
- delete params[0].from
83
- }
84
- if (params[0].gas) {
85
- delete params[0].gas
86
- }
87
- }
88
-
89
- let result
90
- // For sending a transaction if we call send it will error
91
- // as it wants gasLimit in sendTransaction but hexlify sets the property gas
92
- // to gasLimit which makes send transaction error.
93
- // This have taken the code from the super method for sendTransaction and altered
94
- // it slightly to make it work with the gas limit issues.
95
- if (
96
- params &&
97
- params.length &&
98
- params[0].from &&
99
- method === 'eth_sendTransaction'
100
- ) {
101
- // Hexlify will not take gas, must be gasLimit, set this property to be gasLimit
102
- params[0].gasLimit = params[0].gas
103
- delete params[0].gas
104
- // If from is present on eth_sendTransaction it errors, removing it makes the library set
105
- // from as the connected wallet which works fine
106
- delete params[0].from
107
- const req = ethers.providers.JsonRpcProvider.hexlifyTransaction(
108
- params[0],
109
- )
110
- // Hexlify sets the gasLimit property to be gas again and send transaction requires gasLimit
111
- req.gasLimit = req.gas
112
- delete req.gas
113
- // Send the transaction
114
- const tx = await this.signer.sendTransaction(req)
115
- result = tx.hash
116
- } else {
117
- // All other transactions the base class works for
118
- result = await super.send(method, params)
119
- }
120
- console.debug('result received', method, params, result)
121
- if (isCallbackForm) {
122
- callback(null, { result })
123
- } else {
124
- return result
125
- }
126
- } catch (error) {
127
- console.log(error)
128
- if (isCallbackForm) {
129
- callback(error, null)
130
- } else {
131
- throw error
132
- }
133
- }
134
- }
135
- }
136
-
137
- export const getProvider = (chainId = ChainEnum.Goerli) => {
138
- const rpcUrlMap: { [x: number]: { name: string; url: string } } = {
139
- [ChainEnum.Goerli]: {
140
- name: 'Goerli',
141
- url: `https://goerli.infura.io/v3/${process.env.REACT_APP_INFURA_API_KEY}`,
142
- },
143
- [ChainEnum.Mumbai]: {
144
- name: 'Mumbai',
145
- url: `https://polygon-mumbai.g.alchemy.com/v2/${process.env.REACT_APP_ALCHEMY_API_KEY}`,
146
- },
147
- }
148
- return new JsonRpcProvider(rpcUrlMap[chainId].url, {
149
- name: rpcUrlMap[chainId].name,
150
- chainId,
151
- })
152
- }
153
-
154
- export const getInjectedMetamask = (
155
- testPrivateKey: string,
156
- chainId = ChainEnum.Goerli,
157
- ) => {
158
- const TEST_ADDRESS_NEVER_USE = new Wallet(testPrivateKey).address
159
- const provider = getProvider(chainId)
160
- const signer = new Wallet(testPrivateKey, provider)
161
- return new MetamaskBridge(signer, provider, TEST_ADDRESS_NEVER_USE, chainId)
162
- }
163
-
164
- export const getSigner = (
165
- testPrivateKey: string,
166
- chainId = ChainEnum.Goerli,
167
- ) => {
168
- return new Wallet(testPrivateKey, getProvider(chainId))
169
- }
1
+ /* eslint-disable arrow-body-style */
2
+ /* eslint-disable @typescript-eslint/lines-between-class-members */
3
+ /* eslint-disable prefer-destructuring */
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable consistent-return */
6
+ /**
7
+ * Updates cy.visit() to include an injected window.ethereum provider.
8
+ */
9
+ import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
10
+ import { JsonRpcProvider } from '@ethersproject/providers'
11
+ import { ethers, Wallet } from 'ethers'
12
+ import { deepCopy } from 'ethers/lib/utils'
13
+
14
+ export enum ChainEnum {
15
+ Goerli = 5,
16
+ Mumbai = 80001,
17
+ }
18
+
19
+ class MetamaskBridge extends Eip1193Bridge {
20
+ private walletAddress: string
21
+ private chainId: number
22
+
23
+ constructor(
24
+ signer: ethers.Signer,
25
+ provider: ethers.providers.Provider,
26
+ walletAddress: string,
27
+ chainId = 5,
28
+ ) {
29
+ super(signer, provider)
30
+ this.walletAddress = walletAddress
31
+ this.chainId = chainId
32
+ }
33
+
34
+ async sendAsync(...args: any[]) {
35
+ console.debug('sendAsync called', ...args)
36
+ return this.send(...args)
37
+ }
38
+ async send(...args: any[]) {
39
+ console.debug('send called', ...args)
40
+ const isCallbackForm =
41
+ typeof args[0] === 'object' && typeof args[1] === 'function'
42
+ let callback
43
+ let method
44
+ let params
45
+ if (isCallbackForm) {
46
+ callback = args[1]
47
+ method = args[0].method
48
+ params = args[0].params
49
+ } else {
50
+ method = args[0]
51
+ params = args[1]
52
+ }
53
+ if (method === 'eth_requestAccounts' || method === 'eth_accounts') {
54
+ if (isCallbackForm) {
55
+ callback({ result: [this.walletAddress] })
56
+ } else {
57
+ return Promise.resolve([this.walletAddress])
58
+ }
59
+ }
60
+ if (method === 'eth_chainId') {
61
+ const chainIdHex = ethers.utils.hexlify(this.chainId)
62
+ if (isCallbackForm) {
63
+ callback(null, { result: chainIdHex })
64
+ } else {
65
+ return Promise.resolve(chainIdHex)
66
+ }
67
+ }
68
+ // Eip1193Bridge only supports eth_sign
69
+ // address is the first param for eth_sign
70
+ if (method === 'personal_sign') {
71
+ method = 'eth_sign'
72
+ const [data, address] = deepCopy(params)
73
+ params[0] = address
74
+ params[1] = data
75
+ }
76
+ try {
77
+ // Please refer to: https://github.com/ethers-io/ethers.js/issues/1683
78
+ // If from is present on eth_call it errors, removing it makes the library set
79
+ // from as the connected wallet which works fine
80
+ if (params && params.length && method === 'eth_call') {
81
+ if (params[0].from) {
82
+ delete params[0].from
83
+ }
84
+ if (params[0].gas) {
85
+ delete params[0].gas
86
+ }
87
+ }
88
+
89
+ let result
90
+ // For sending a transaction if we call send it will error
91
+ // as it wants gasLimit in sendTransaction but hexlify sets the property gas
92
+ // to gasLimit which makes send transaction error.
93
+ // This have taken the code from the super method for sendTransaction and altered
94
+ // it slightly to make it work with the gas limit issues.
95
+ if (
96
+ params &&
97
+ params.length &&
98
+ params[0].from &&
99
+ method === 'eth_sendTransaction'
100
+ ) {
101
+ // Hexlify will not take gas, must be gasLimit, set this property to be gasLimit
102
+ params[0].gasLimit = params[0].gas
103
+ delete params[0].gas
104
+ // If from is present on eth_sendTransaction it errors, removing it makes the library set
105
+ // from as the connected wallet which works fine
106
+ delete params[0].from
107
+ const req = ethers.providers.JsonRpcProvider.hexlifyTransaction(
108
+ params[0],
109
+ )
110
+ // Hexlify sets the gasLimit property to be gas again and send transaction requires gasLimit
111
+ req.gasLimit = req.gas
112
+ delete req.gas
113
+ // Send the transaction
114
+ const tx = await this.signer.sendTransaction(req)
115
+ result = tx.hash
116
+ } else {
117
+ // All other transactions the base class works for
118
+ result = await super.send(method, params)
119
+ }
120
+ console.debug('result received', method, params, result)
121
+ if (isCallbackForm) {
122
+ callback(null, { result })
123
+ } else {
124
+ return result
125
+ }
126
+ } catch (error) {
127
+ console.log(error)
128
+ if (isCallbackForm) {
129
+ callback(error, null)
130
+ } else {
131
+ throw error
132
+ }
133
+ }
134
+ }
135
+ }
136
+
137
+ export const getProvider = (chainId = ChainEnum.Goerli) => {
138
+ const rpcUrlMap: { [x: number]: { name: string; url: string } } = {
139
+ [ChainEnum.Goerli]: {
140
+ name: 'Goerli',
141
+ url: `https://goerli.infura.io/v3/${process.env.REACT_APP_INFURA_API_KEY}`,
142
+ },
143
+ [ChainEnum.Mumbai]: {
144
+ name: 'Mumbai',
145
+ url: `https://polygon-mumbai.g.alchemy.com/v2/${process.env.REACT_APP_ALCHEMY_API_KEY}`,
146
+ },
147
+ }
148
+ return new JsonRpcProvider(rpcUrlMap[chainId].url, {
149
+ name: rpcUrlMap[chainId].name,
150
+ chainId,
151
+ })
152
+ }
153
+
154
+ export const getInjectedMetamask = (
155
+ testPrivateKey: string,
156
+ chainId = ChainEnum.Goerli,
157
+ ) => {
158
+ const TEST_ADDRESS_NEVER_USE = new Wallet(testPrivateKey).address
159
+ const provider = getProvider(chainId)
160
+ const signer = new Wallet(testPrivateKey, provider)
161
+ return new MetamaskBridge(signer, provider, TEST_ADDRESS_NEVER_USE, chainId)
162
+ }
163
+
164
+ export const getSigner = (
165
+ testPrivateKey: string,
166
+ chainId = ChainEnum.Goerli,
167
+ ) => {
168
+ return new Wallet(testPrivateKey, getProvider(chainId))
169
+ }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,53 +1,53 @@
1
- import {
2
- EAPayload,
3
- EARejectionError,
4
- EARejectMessage,
5
- EARejectReason,
6
- EAService,
7
- } from '@huma-finance/shared'
8
- import { useWeb3React } from '@web3-react/core'
9
- import { useCallback } from 'react'
10
-
11
- import { setApproval, setError } from '../store/widgets.reducers'
12
- import { WIDGET_STEP } from '../store/widgets.store'
13
- import { envUtil } from '../utils/env'
14
- import { useAppDispatch } from './useRedux'
15
-
16
- const useEA = () => {
17
- const dispatch = useAppDispatch()
18
- const { chainId } = useWeb3React()
19
-
20
- const checkingEA = useCallback(
21
- async (payload: EAPayload, nextStep: WIDGET_STEP) => {
22
- try {
23
- const result = await EAService.approve(
24
- payload,
25
- chainId!,
26
- envUtil.checkIsDev(),
27
- )
28
- dispatch(setApproval({ ...result, nextStep }))
29
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
- } catch (e: any) {
31
- if (e instanceof EARejectionError) {
32
- dispatch(
33
- setError({
34
- errorMessage: EARejectMessage,
35
- errorReason: EARejectReason,
36
- }),
37
- )
38
- } else {
39
- dispatch(
40
- setError({
41
- errorMessage: e.message,
42
- }),
43
- )
44
- }
45
- }
46
- },
47
- [chainId, dispatch],
48
- )
49
-
50
- return { checkingEA }
51
- }
52
-
53
- export default useEA
1
+ import {
2
+ EAPayload,
3
+ EARejectionError,
4
+ EARejectMessage,
5
+ EARejectReason,
6
+ EAService,
7
+ } from '@huma-finance/shared'
8
+ import { useWeb3React } from '@web3-react/core'
9
+ import { useCallback } from 'react'
10
+
11
+ import { setApproval, setError } from '../store/widgets.reducers'
12
+ import { WIDGET_STEP } from '../store/widgets.store'
13
+ import { envUtil } from '../utils/env'
14
+ import { useAppDispatch } from './useRedux'
15
+
16
+ const useEA = () => {
17
+ const dispatch = useAppDispatch()
18
+ const { chainId } = useWeb3React()
19
+
20
+ const checkingEA = useCallback(
21
+ async (payload: EAPayload, nextStep: WIDGET_STEP) => {
22
+ try {
23
+ const result = await EAService.approve(
24
+ payload,
25
+ chainId!,
26
+ envUtil.checkIsDev(),
27
+ )
28
+ dispatch(setApproval({ ...result, nextStep }))
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ } catch (e: any) {
31
+ if (e instanceof EARejectionError) {
32
+ dispatch(
33
+ setError({
34
+ errorMessage: EARejectMessage,
35
+ errorReason: EARejectReason,
36
+ }),
37
+ )
38
+ } else {
39
+ dispatch(
40
+ setError({
41
+ errorMessage: e.message,
42
+ }),
43
+ )
44
+ }
45
+ }
46
+ },
47
+ [chainId, dispatch],
48
+ )
49
+
50
+ return { checkingEA }
51
+ }
52
+
53
+ export default useEA
@@ -0,0 +1,71 @@
1
+ import { useEffect, useState } from 'react'
2
+ import {
3
+ doesChainSupportNotifi,
4
+ getBlockchainConfigFromChain,
5
+ } from '@huma-finance/shared'
6
+ import { newFrontendClient } from '@notifi-network/notifi-frontend-client'
7
+ import { envUtil } from '../utils/env'
8
+
9
+ export const useIsFirstTimeNotifiUser = (
10
+ account: string | undefined,
11
+ chainId: number | undefined,
12
+ ) => {
13
+ const [isFirstTimeNotifiUser, setIsFirstTimeNotifiUser] = useState(false)
14
+
15
+ useEffect(() => {
16
+ const checkIsFirstTimeNotifiUser = async () => {
17
+ if (account != null && chainId != null) {
18
+ const client = newFrontendClient({
19
+ account: { publicKey: account },
20
+ tenantId: 'humadapp',
21
+ env: envUtil.checkIsDev() ? 'Development' : 'Production',
22
+ walletBlockchain: getBlockchainConfigFromChain(chainId),
23
+ })
24
+
25
+ const userState = await client.initialize()
26
+
27
+ // If the user is not authenticated or expired, they are a first time user
28
+ if (
29
+ userState.status !== 'authenticated' &&
30
+ userState.status !== 'expired'
31
+ ) {
32
+ setIsFirstTimeNotifiUser(true)
33
+ } else if (userState.status === 'authenticated') {
34
+ // If a user is authenticated, check if they have a target group (AKA email)
35
+ // associated with their wallet. If they do not, show them the notifi onboarding flow.
36
+ const targetGroups = await client.getTargetGroups()
37
+ const emailTargets = targetGroups[0]?.emailTargets?.[0]
38
+
39
+ if (emailTargets == null || emailTargets.emailAddress == null) {
40
+ setIsFirstTimeNotifiUser(true)
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ checkIsFirstTimeNotifiUser()
47
+ }, [account, chainId])
48
+
49
+ return { isFirstTimeNotifiUser }
50
+ }
51
+
52
+ export const useDoesChainSupportNotifi = (
53
+ account: string | undefined,
54
+ chainId: number | undefined,
55
+ ) => {
56
+ const [notifiChainSupported, setNotifiChainSupported] = useState(false)
57
+
58
+ useEffect(() => {
59
+ const checkNotifiChainSupported = async () => {
60
+ if (account != null && chainId != null) {
61
+ setNotifiChainSupported(
62
+ doesChainSupportNotifi(chainId, envUtil.checkIsDev(), account),
63
+ )
64
+ }
65
+ }
66
+
67
+ checkNotifiChainSupported()
68
+ }, [account, chainId])
69
+
70
+ return { notifiChainSupported }
71
+ }
@@ -1,6 +1,6 @@
1
- import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
2
- import type { RootState, AppDispatch } from '../store'
3
-
4
- // Use throughout your app instead of plain `useDispatch` and `useSelector`
5
- export const useAppDispatch = () => useDispatch<AppDispatch>()
6
- export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
1
+ import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
2
+ import type { RootState, AppDispatch } from '../store'
3
+
4
+ // Use throughout your app instead of plain `useDispatch` and `useSelector`
5
+ export const useAppDispatch = () => useDispatch<AppDispatch>()
6
+ export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector