@huma-finance/widgets 0.0.29 → 0.0.31
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.
- package/.env.example +2 -2
- package/.eslintignore +2 -2
- package/.eslintrc.js +64 -64
- package/.prettierignore +4 -4
- package/.prettierrc.js +16 -16
- package/API.md +332 -332
- package/LICENSE +660 -660
- package/README.md +48 -48
- package/babel.config.js +15 -15
- package/config-overrides.js +9 -9
- package/cosmos.config.json +7 -7
- package/cypress/e2e/01-invoice-factoring-borrow.test.ts +62 -62
- package/cypress/support/e2e.ts +76 -76
- package/cypress/support/ethereum.ts +142 -142
- package/cypress/tsconfig.json +9 -9
- package/cypress/utils/index.ts +54 -54
- package/cypress.config.ts +20 -20
- package/dist/cjs/index.cjs +144 -142
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.d.ts +193 -193
- package/dist/index.js +145 -143
- package/dist/index.js.map +1 -1
- package/jsdoc2md.json +20 -20
- package/package.json +5 -4
- package/public/index.html +40 -40
- package/public/manifest.json +25 -25
- package/public/robots.txt +3 -3
- package/rollup.config.js +81 -81
- package/src/components/Activity.tsx +132 -132
- package/src/components/ApolloWrapper.tsx +15 -15
- package/src/components/ApproveAllowanceModal.tsx +121 -121
- package/src/components/BottomButton.tsx +33 -33
- package/src/components/ChainNotSupportedModal.tsx +33 -33
- package/src/components/ConfirmTransferModal.tsx +153 -153
- package/src/components/CreditLine/borrow/1-Evaluation.tsx +157 -157
- package/src/components/CreditLine/borrow/2-ChooseAmount.tsx +68 -68
- package/src/components/CreditLine/borrow/3-Transfer.tsx +44 -44
- package/src/components/CreditLine/borrow/4-ApproveAllowance.tsx +29 -29
- package/src/components/CreditLine/borrow/5-Success.tsx +30 -30
- package/src/components/CreditLine/borrow/index.tsx +117 -117
- package/src/components/CreditLine/payment/1-ChooseAmount.tsx +67 -67
- package/src/components/CreditLine/payment/2-ApproveAllowance.tsx +23 -23
- package/src/components/CreditLine/payment/3-Transfer.tsx +34 -34
- package/src/components/CreditLine/payment/4-Success.tsx +39 -39
- package/src/components/CreditLine/payment/index.tsx +94 -94
- package/src/components/ErrorModal.tsx +132 -132
- package/src/components/Factoring/FactoredList.tsx +143 -143
- package/src/components/Factoring/UpcomingList.tsx +90 -90
- package/src/components/Factoring/index.ts +2 -2
- package/src/components/HumaLoading.tsx +68 -68
- package/src/components/HumaTable.tsx +158 -158
- package/src/components/InvoiceFactoring/borrow/1-Evaluation.tsx +49 -49
- package/src/components/InvoiceFactoring/borrow/2-ChooseAmount.tsx +88 -88
- package/src/components/InvoiceFactoring/borrow/3-ConfirmTransfer.tsx +37 -37
- package/src/components/InvoiceFactoring/borrow/4-ApproveNFT.tsx +55 -55
- package/src/components/InvoiceFactoring/borrow/5-Transfer.tsx +34 -34
- package/src/components/InvoiceFactoring/borrow/6-Success.tsx +20 -20
- package/src/components/InvoiceFactoring/borrow/index.tsx +94 -94
- package/src/components/InvoiceFactoring/payment/1-ChooseAmount.tsx +67 -67
- package/src/components/InvoiceFactoring/payment/2-ApproveAllowance.tsx +23 -23
- package/src/components/InvoiceFactoring/payment/3-Transfer.tsx +34 -34
- package/src/components/InvoiceFactoring/payment/4-Success.tsx +23 -23
- package/src/components/InvoiceFactoring/payment/index.tsx +86 -86
- package/src/components/Lend/supply/1-Evaluation.tsx +175 -171
- package/src/components/Lend/supply/2-ChooseAmount.tsx +70 -70
- package/src/components/Lend/supply/3-ApproveAllowance.tsx +25 -25
- package/src/components/Lend/supply/4-ConfirmTransfer.tsx +104 -104
- package/src/components/Lend/supply/6-Transfer.tsx +32 -32
- package/src/components/Lend/supply/7-Success.tsx +49 -49
- package/src/components/Lend/supply/index.tsx +144 -144
- package/src/components/Lend/withdraw/1-CheckWithdrawble.tsx +73 -73
- package/src/components/Lend/withdraw/2-ChooseAmount.tsx +50 -50
- package/src/components/Lend/withdraw/3-Transfer.tsx +32 -32
- package/src/components/Lend/withdraw/4-Success.tsx +49 -49
- package/src/components/Lend/withdraw/index.tsx +101 -101
- package/src/components/LoadingModal.tsx +49 -49
- package/src/components/NotifiSubscriptionModal.tsx +84 -0
- package/src/components/StreamFactoring/borrow/1-Evaluation.tsx +55 -55
- package/src/components/StreamFactoring/borrow/2-ChooseAmount.tsx +127 -127
- package/src/components/StreamFactoring/borrow/3-ConfirmTransfer.tsx +42 -42
- package/src/components/StreamFactoring/borrow/4-ApproveAllowance.tsx +33 -33
- package/src/components/StreamFactoring/borrow/5-Permit.tsx +144 -144
- package/src/components/StreamFactoring/borrow/6-Transfer.tsx +37 -37
- package/src/components/StreamFactoring/borrow/7-Success.tsx +20 -20
- package/src/components/StreamFactoring/borrow/index.tsx +94 -94
- package/src/components/StreamFactoring/payment/ChooseAmount.tsx +54 -54
- package/src/components/StreamFactoring/payment/Success.tsx +23 -23
- package/src/components/StreamFactoring/payment/Transfer.tsx +34 -34
- package/src/components/StreamFactoring/payment/index.tsx +66 -66
- package/src/components/SuperfluidFactoring/SuperfluidFactoredList.tsx +70 -70
- package/src/components/SuperfluidFactoring/SuperfluidUpcomingList.tsx +167 -167
- package/src/components/SuperfluidFactoring/index.tsx +85 -85
- package/src/components/TxDoneModal.tsx +83 -83
- package/src/components/TxSendModal.tsx +59 -59
- package/src/components/ViewOnExplorer.tsx +26 -26
- package/src/components/WidgetWrapper.tsx +74 -74
- package/src/components/WrapperModal.tsx +54 -54
- package/src/components/buttons/TableActionButton.tsx +36 -36
- package/src/components/buttons/index.ts +1 -1
- package/src/components/humaModal/HumaModal.tsx +68 -68
- package/src/components/humaModal/HumaModalHeader.tsx +70 -70
- package/src/components/humaModal/index.tsx +2 -2
- package/src/components/icons/approve-lender.svg +30 -30
- package/src/components/icons/auto-payback.svg +40 -40
- package/src/components/icons/check-circle.svg +3 -3
- package/src/components/icons/check-green.svg +3 -3
- package/src/components/icons/check.svg +10 -10
- package/src/components/icons/donut.svg +904 -904
- package/src/components/icons/ellipse.svg +3 -3
- package/src/components/icons/huma-full.svg +22 -22
- package/src/components/icons/huma.svg +15 -15
- package/src/components/icons/index.tsx +93 -93
- package/src/components/icons/loader.svg +229 -229
- package/src/components/icons/metamask.svg +31 -31
- package/src/components/icons/polygon.svg +16 -16
- package/src/components/icons/receipt.svg +3 -3
- package/src/components/icons/separator.svg +3 -3
- package/src/components/icons/sorry.svg +31 -31
- package/src/components/icons/usdc.svg +5 -5
- package/src/components/icons/wallet-connect.svg +11 -11
- package/src/cosmos/CreditLineBorrow.fixture.tsx +86 -86
- package/src/cosmos/CreditLinePayment.fixture.tsx +50 -50
- package/src/cosmos/InvoiceFactoringBorrow.fixture.tsx +111 -111
- package/src/cosmos/InvoiceFactoringPayment.fixture.tsx +67 -67
- package/src/cosmos/LendSupply.fixture.tsx +75 -75
- package/src/cosmos/LendWithdraw.fixture.tsx +43 -43
- package/src/cosmos/SDKTesting.fixture.tsx +4 -3
- package/src/cosmos/SuperfluidFactoringBorrow.fixture.tsx +15 -15
- package/src/cosmos/WalletWrapper.tsx +52 -52
- package/src/cosmos/abis/InvoiceNFT.json +644 -644
- package/src/cosmos/abis/ReceivableFactoringPool.json +1529 -1529
- package/src/cosmos/utils/env.ts +6 -6
- package/src/cosmos/utils/index.ts +169 -169
- package/src/fonts/Recoleta/Recoleta-Black.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-Bold.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-Light.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-Medium.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-Regular.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-RegularDEMO.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-SemiBold.otf +0 -0
- package/src/fonts/Recoleta/Recoleta-Thin.otf +0 -0
- package/src/hooks/useEA.ts +53 -53
- package/src/hooks/useRedux.ts +6 -6
- package/src/index.css +61 -61
- package/src/index.tsx +301 -301
- package/src/react-app-env.d.ts +1 -1
- package/src/reportWebVitals.ts +15 -15
- package/src/setupTests.ts +6 -6
- package/src/store/index.ts +27 -27
- package/src/store/widgets.reducers.ts +120 -120
- package/src/store/widgets.selectors.ts +3 -3
- package/src/store/widgets.store.ts +54 -54
- package/src/theme/breakpoints.ts +10 -10
- package/src/theme/components.ts +70 -70
- package/src/theme/coreThemeConstants.ts +29 -29
- package/src/theme/cssMixins.ts +92 -92
- package/src/theme/hooks/useGetSizes.ts +31 -31
- package/src/theme/index.ts +24 -24
- package/src/theme/palette.ts +150 -150
- package/src/theme/shape.ts +7 -7
- package/src/theme/theme.types.ts +80 -80
- package/src/theme/typography.ts +117 -117
- package/src/utilTypes.d.ts +31 -31
- package/src/utils/env.ts +10 -10
- package/tsconfig.build.json +7 -7
- package/tsconfig.json +32 -32
- package/webpack.cosmos.js +54 -54
package/src/cosmos/utils/env.ts
CHANGED
|
@@ -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
|
package/src/hooks/useEA.ts
CHANGED
|
@@ -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
|
package/src/hooks/useRedux.ts
CHANGED
|
@@ -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
|
package/src/index.css
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
@font-face {
|
|
2
|
-
font-family: 'Recoleta-Medium';
|
|
3
|
-
src: local('Recoleta-Medium'),
|
|
4
|
-
url(./fonts/Recoleta/Recoleta-Medium.otf) format('truetype');
|
|
5
|
-
font-weight: 500;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
@font-face {
|
|
9
|
-
font-family: 'Roboto-Medium';
|
|
10
|
-
src: local('Roboto-Medium'),
|
|
11
|
-
url(./fonts/Roboto/Roboto-Medium.ttf) format('truetype');
|
|
12
|
-
font-weight: 500;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
@font-face {
|
|
16
|
-
font-family: 'Roboto-Regular';
|
|
17
|
-
src: local('Roboto-Regular'),
|
|
18
|
-
url(./fonts/Roboto/Roboto-Regular.ttf) format('truetype');
|
|
19
|
-
font-weight: 400;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
@font-face {
|
|
23
|
-
font-family: 'Inter-Bold';
|
|
24
|
-
src: local('Inter-Bold'), url(./fonts/Inter/Inter-Bold.ttf) format('truetype');
|
|
25
|
-
font-weight: 700;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
@font-face {
|
|
29
|
-
font-family: 'Inter-Medium';
|
|
30
|
-
src: local('Inter-Medium'),
|
|
31
|
-
url(./fonts/Inter/Inter-Medium.ttf) format('truetype');
|
|
32
|
-
font-weight: 500;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@font-face {
|
|
36
|
-
font-family: 'Inter-Regular';
|
|
37
|
-
src: local('Inter-Regular'),
|
|
38
|
-
url(./fonts/Inter/Inter-Regular.ttf) format('truetype');
|
|
39
|
-
font-weight: 400;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@font-face {
|
|
43
|
-
font-family: 'Uni-Neue-Black';
|
|
44
|
-
src: local('Uni-Neue-Black'),
|
|
45
|
-
url(./fonts/UniNeue/UniNeue-Black.ttf) format('truetype');
|
|
46
|
-
font-weight: 800;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@font-face {
|
|
50
|
-
font-family: 'Uni-Neue-Bold';
|
|
51
|
-
src: local('Uni-Neue-Bold'),
|
|
52
|
-
url(./fonts/UniNeue/UniNeue-Bold.ttf) format('truetype');
|
|
53
|
-
font-weight: 700;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@font-face {
|
|
57
|
-
font-family: 'Uni-Neue-Regular';
|
|
58
|
-
src: local('Uni-Neue-Regular'),
|
|
59
|
-
url(./fonts/UniNeue/UniNeue-Regular.ttf) format('truetype');
|
|
60
|
-
font-weight: 400;
|
|
61
|
-
}
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: 'Recoleta-Medium';
|
|
3
|
+
src: local('Recoleta-Medium'),
|
|
4
|
+
url(./fonts/Recoleta/Recoleta-Medium.otf) format('truetype');
|
|
5
|
+
font-weight: 500;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@font-face {
|
|
9
|
+
font-family: 'Roboto-Medium';
|
|
10
|
+
src: local('Roboto-Medium'),
|
|
11
|
+
url(./fonts/Roboto/Roboto-Medium.ttf) format('truetype');
|
|
12
|
+
font-weight: 500;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@font-face {
|
|
16
|
+
font-family: 'Roboto-Regular';
|
|
17
|
+
src: local('Roboto-Regular'),
|
|
18
|
+
url(./fonts/Roboto/Roboto-Regular.ttf) format('truetype');
|
|
19
|
+
font-weight: 400;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@font-face {
|
|
23
|
+
font-family: 'Inter-Bold';
|
|
24
|
+
src: local('Inter-Bold'), url(./fonts/Inter/Inter-Bold.ttf) format('truetype');
|
|
25
|
+
font-weight: 700;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@font-face {
|
|
29
|
+
font-family: 'Inter-Medium';
|
|
30
|
+
src: local('Inter-Medium'),
|
|
31
|
+
url(./fonts/Inter/Inter-Medium.ttf) format('truetype');
|
|
32
|
+
font-weight: 500;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@font-face {
|
|
36
|
+
font-family: 'Inter-Regular';
|
|
37
|
+
src: local('Inter-Regular'),
|
|
38
|
+
url(./fonts/Inter/Inter-Regular.ttf) format('truetype');
|
|
39
|
+
font-weight: 400;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@font-face {
|
|
43
|
+
font-family: 'Uni-Neue-Black';
|
|
44
|
+
src: local('Uni-Neue-Black'),
|
|
45
|
+
url(./fonts/UniNeue/UniNeue-Black.ttf) format('truetype');
|
|
46
|
+
font-weight: 800;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@font-face {
|
|
50
|
+
font-family: 'Uni-Neue-Bold';
|
|
51
|
+
src: local('Uni-Neue-Bold'),
|
|
52
|
+
url(./fonts/UniNeue/UniNeue-Bold.ttf) format('truetype');
|
|
53
|
+
font-weight: 700;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@font-face {
|
|
57
|
+
font-family: 'Uni-Neue-Regular';
|
|
58
|
+
src: local('Uni-Neue-Regular'),
|
|
59
|
+
url(./fonts/UniNeue/UniNeue-Regular.ttf) format('truetype');
|
|
60
|
+
font-weight: 400;
|
|
61
|
+
}
|