mirror of
https://github.com/status-im/liquid-funding.git
synced 2025-02-10 10:26:28 +00:00
add handling for authorization, transfer and confirmation
This commit is contained in:
parent
d8bc0cdeda
commit
615e715b14
@ -99,6 +99,7 @@ function Input({
|
|||||||
bottomRightLabel,
|
bottomRightLabel,
|
||||||
bottomRightError,
|
bottomRightError,
|
||||||
bottomLeftLabel,
|
bottomLeftLabel,
|
||||||
|
disabled,
|
||||||
placeholder,
|
placeholder,
|
||||||
className,
|
className,
|
||||||
name,
|
name,
|
||||||
@ -128,6 +129,7 @@ function Input({
|
|||||||
endAdornment={endAdornment}
|
endAdornment={endAdornment}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
name={name}
|
name={name}
|
||||||
|
disabled={disabled}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
classes={{
|
classes={{
|
||||||
root: classes.root,
|
root: classes.root,
|
||||||
|
@ -30,6 +30,12 @@ const { addGiverAndDonate } = LiquidPledging.methods
|
|||||||
const NOT_SUBMITTED = 'Not Submitted'
|
const NOT_SUBMITTED = 'Not Submitted'
|
||||||
const SUBMITTED = 'Submitted'
|
const SUBMITTED = 'Submitted'
|
||||||
const CONFIRMED = 'Confirmed'
|
const CONFIRMED = 'Confirmed'
|
||||||
|
const APPROVED = 'Approved'
|
||||||
|
const NOT_CONNECTED = 0
|
||||||
|
const NOT_APPROVED = 1
|
||||||
|
const IS_APPROVED = 2
|
||||||
|
const IS_SUBMITTED = 3
|
||||||
|
const IS_CONFIRMED = 4
|
||||||
|
|
||||||
const useStyles = makeStyles(styles)
|
const useStyles = makeStyles(styles)
|
||||||
const getProjectId = response => {
|
const getProjectId = response => {
|
||||||
@ -41,18 +47,19 @@ const addProjectSucessMsg = response => {
|
|||||||
return `Project created with ID of ${idProject}, will redirect to your new project page in a few seconds`
|
return `Project created with ID of ${idProject}, will redirect to your new project page in a few seconds`
|
||||||
}
|
}
|
||||||
const STEPS = ['Connect', 'Authorize Amount', 'Fund', 'Confirmation']
|
const STEPS = ['Connect', 'Authorize Amount', 'Fund', 'Confirmation']
|
||||||
|
const buttonText = ['Connect', 'Authorize Amount', 'Fund', 'Awaiting Confirmation', 'Confirmed']
|
||||||
function stepperProgress(values, projectData, submissionState) {
|
function stepperProgress(values, projectData, submissionState) {
|
||||||
console.log({values, projectData})
|
if (submissionState === CONFIRMED) return IS_CONFIRMED
|
||||||
if (submissionState === CONFIRMED) return 4
|
if (submissionState === SUBMITTED) return IS_SUBMITTED
|
||||||
if (submissionState === SUBMITTED) return 3
|
if (submissionState === APPROVED) return IS_APPROVED
|
||||||
if (!projectData.account) return 0
|
if (!projectData.account) return NOT_CONNECTED
|
||||||
const { manifest: { goalToken }, authorization } = projectData
|
const { manifest: { goalToken }, authorization } = projectData
|
||||||
const { amount } = values
|
const { amount } = values
|
||||||
const { chainReadibleFn } = getTokenByAddress(goalToken)
|
const { chainReadibleFn } = getTokenByAddress(goalToken)
|
||||||
const weiAmount = amount ? chainReadibleFn(amount) : '0'
|
const weiAmount = amount ? chainReadibleFn(amount) : '0'
|
||||||
const isAuthorized = toBN(authorization).gte(toBN(weiAmount))
|
const isAuthorized = toBN(authorization).gte(toBN(weiAmount))
|
||||||
if (!isAuthorized) return 1
|
if (!isAuthorized) return NOT_APPROVED
|
||||||
return 2
|
return IS_APPROVED
|
||||||
}
|
}
|
||||||
const optimisticUpdate = (client, pledgesInfo, weiAmount) => {
|
const optimisticUpdate = (client, pledgesInfo, weiAmount) => {
|
||||||
const { __typename } = pledgesInfo
|
const { __typename } = pledgesInfo
|
||||||
@ -90,14 +97,24 @@ const SubmissionSection = ({ classes, projectData, projectId, profileData, start
|
|||||||
if (!activeStep) return enableEthereum()
|
if (!activeStep) return enableEthereum()
|
||||||
const { amount } = values
|
const { amount } = values
|
||||||
const { goalToken } = manifest
|
const { goalToken } = manifest
|
||||||
const { chainReadibleFn } = getTokenByAddress(goalToken)
|
const { chainReadibleFn, setAllowance } = getTokenByAddress(goalToken)
|
||||||
const userAccount = account ? account : await enableEthereum()
|
const userAccount = account ? account : await enableEthereum()
|
||||||
const weiAmount = chainReadibleFn(amount)
|
const weiAmount = chainReadibleFn(amount)
|
||||||
|
if (activeStep === NOT_APPROVED) {
|
||||||
|
const toSend = setAllowance(weiAmount)
|
||||||
|
return toSend
|
||||||
|
.send({ from: account })
|
||||||
|
.then(async res => {
|
||||||
|
console.log({res})
|
||||||
|
setSubmissionState(APPROVED)
|
||||||
|
})
|
||||||
|
.catch(e => console.log({e}))
|
||||||
|
}
|
||||||
|
|
||||||
const args = [projectId, userAccount, goalToken, weiAmount]
|
const args = [projectId, userAccount, goalToken, weiAmount]
|
||||||
const toSend = addGiverAndDonate(...args)
|
const toSend = addGiverAndDonate(...args)
|
||||||
const estimatedGas = await toSend.estimateGas()
|
|
||||||
toSend
|
toSend
|
||||||
.send({gas: estimatedGas + 100})
|
.send({from: account})
|
||||||
.on('transactionHash', (hash) => {
|
.on('transactionHash', (hash) => {
|
||||||
optimisticUpdate(client, pledgesInfo, weiAmount)
|
optimisticUpdate(client, pledgesInfo, weiAmount)
|
||||||
setSubmissionState(SUBMITTED)
|
setSubmissionState(SUBMITTED)
|
||||||
@ -199,11 +216,12 @@ const SubmissionSection = ({ classes, projectData, projectId, profileData, start
|
|||||||
bottomRightLabel={usdValue}
|
bottomRightLabel={usdValue}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
onBlur={handleBlur}
|
onBlur={handleBlur}
|
||||||
|
disabled={activeStep >= IS_SUBMITTED}
|
||||||
value={values.amount || ''}
|
value={values.amount || ''}
|
||||||
/>
|
/>
|
||||||
<div className={classes.amountText}>{getTokenLabel(manifest.goalToken)}</div>
|
<div className={classes.amountText}>{getTokenLabel(manifest.goalToken)}</div>
|
||||||
</div>}
|
</div>}
|
||||||
<Button type="submit" color="primary" variant="contained" className={classnames(classes.formButton)}>{STEPS[activeStep]}</Button>
|
<Button disabled={activeStep >= IS_SUBMITTED} type="submit" color="primary" variant="contained" className={classnames(classes.formButton)}>{buttonText[activeStep]}</Button>
|
||||||
<FundStepper steps={STEPS} activeStep={activeStep} />
|
<FundStepper steps={STEPS} activeStep={activeStep} />
|
||||||
</div>}
|
</div>}
|
||||||
</form>
|
</form>
|
||||||
|
@ -19,7 +19,9 @@ export const currencies = [
|
|||||||
contract: SNT,
|
contract: SNT,
|
||||||
humanReadibleFn: toEther,
|
humanReadibleFn: toEther,
|
||||||
chainReadibleFn: toWei,
|
chainReadibleFn: toWei,
|
||||||
getAllowance: () => getLpAllowance(SNT)
|
getAllowance: () => getLpAllowance(SNT),
|
||||||
|
setAllowance: (amount) => transferApproval(SNT, amount)
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '0xf5dce57282a584d2746faf1593d3121fcac444dc',
|
value: '0xf5dce57282a584d2746faf1593d3121fcac444dc',
|
||||||
@ -29,7 +31,9 @@ export const currencies = [
|
|||||||
contract: cDAI,
|
contract: cDAI,
|
||||||
humanReadibleFn: compoundWhole,
|
humanReadibleFn: compoundWhole,
|
||||||
chainReadibleFn: compoundToChain,
|
chainReadibleFn: compoundToChain,
|
||||||
getAllowance: () => getLpAllowance(cDAI)
|
getAllowance: () => getLpAllowance(cDAI),
|
||||||
|
setAllowance: (amount) => transferApproval(cDAI, amount)
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5',
|
value: '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5',
|
||||||
@ -39,7 +43,8 @@ export const currencies = [
|
|||||||
contract: cETH,
|
contract: cETH,
|
||||||
humanReadibleFn: compoundWhole,
|
humanReadibleFn: compoundWhole,
|
||||||
chainReadibleFn: compoundToChain,
|
chainReadibleFn: compoundToChain,
|
||||||
getAllowance: () => getLpAllowance(cETH)
|
getAllowance: () => getLpAllowance(cETH),
|
||||||
|
setAllowance: (amount) => transferApproval(cETH, amount)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
value: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||||||
@ -57,7 +62,9 @@ export const currencies = [
|
|||||||
contract: DAI,
|
contract: DAI,
|
||||||
humanReadibleFn: toEther,
|
humanReadibleFn: toEther,
|
||||||
chainReadibleFn: toWei,
|
chainReadibleFn: toWei,
|
||||||
getAllowance: () => getLpAllowance(DAI)
|
getAllowance: () => getLpAllowance(DAI),
|
||||||
|
setAllowance: (amount) => transferApproval(DAI, amount)
|
||||||
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -83,6 +90,11 @@ export const getAllowanceFromAddress = tokenAddress => {
|
|||||||
return token.getAllowance()
|
return token.getAllowance()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const setAllowanceFromAddress = async (tokenAddres, amount) => {
|
||||||
|
const token = getTokenByAddress(tokenAddres)
|
||||||
|
return token.setAllowance(amount)
|
||||||
|
}
|
||||||
|
|
||||||
export const getLpAllowance = async contract => {
|
export const getLpAllowance = async contract => {
|
||||||
const { methods: { allowance } } = contract || SNT
|
const { methods: { allowance } } = contract || SNT
|
||||||
const account = await web3.eth.getCoinbase()
|
const account = await web3.eth.getCoinbase()
|
||||||
@ -90,3 +102,12 @@ export const getLpAllowance = async contract => {
|
|||||||
const allowanceAmt = await allowance(account, spender).call()
|
const allowanceAmt = await allowance(account, spender).call()
|
||||||
return allowanceAmt
|
return allowanceAmt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const transferApproval = (contract, amount) => {
|
||||||
|
const { methods: { approve } } = contract || SNT
|
||||||
|
const spender = LiquidPledging._address
|
||||||
|
return approve(
|
||||||
|
spender,
|
||||||
|
amount
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user