Merge pull request #295 from grant-project/require-sapling-payout
Require sapling payout address
This commit is contained in:
commit
afb0695e5d
|
@ -29,18 +29,22 @@ export default class CreateFlowPayment extends React.Component<Props, State> {
|
|||
render() {
|
||||
const { payoutAddress, deadlineDuration } = this.state;
|
||||
const errors = getCreateErrors(this.state, true);
|
||||
const payoutHelp = errors.payoutAddress || `
|
||||
This must be a Sapling Z address
|
||||
`;
|
||||
|
||||
return (
|
||||
<Form layout="vertical" style={{ maxWidth: 600, margin: '0 auto' }}>
|
||||
<Form.Item
|
||||
label="Payout address"
|
||||
validateStatus={errors.payoutAddress ? 'error' : undefined}
|
||||
help={errors.payoutAddress}
|
||||
help={payoutHelp}
|
||||
style={{ marginBottom: '2rem' }}
|
||||
>
|
||||
<Input
|
||||
size="large"
|
||||
name="payoutAddress"
|
||||
placeholder={DONATION.ZCASH_SPROUT}
|
||||
placeholder={DONATION.ZCASH_SAPLING}
|
||||
type="text"
|
||||
value={payoutAddress}
|
||||
onChange={this.handleInputChange}
|
||||
|
|
|
@ -104,7 +104,7 @@ class CreateReview extends React.Component<Props> {
|
|||
},
|
||||
{
|
||||
step: CREATE_STEP.PAYMENT,
|
||||
name: 'Governance',
|
||||
name: 'Payment',
|
||||
fields: [
|
||||
{
|
||||
key: 'payoutAddress',
|
||||
|
|
|
@ -14,7 +14,7 @@ const createExampleProposal = (): Partial<ProposalDraft> => {
|
|||
target: '5',
|
||||
// Testnet address, assumes you wouldn't use this in production
|
||||
payoutAddress:
|
||||
'ztfFV7AqJqBm1EcWvP3oktZUMnp91ygfduE6ZQqGWENM1CpRKJLMZp2kgChnJVc6CbKSZ4mS37iNaiDwcatxjZcfoi2g7E8',
|
||||
'ztestsapling12uyydevkh2gsnnrzuhzz4taw3v544jrpa3v6t7zv4ae45dquau7cfw26u3uzt520m08cs3jxqqs',
|
||||
milestones: [
|
||||
{
|
||||
title: 'Initial Funding',
|
||||
|
|
|
@ -6,7 +6,7 @@ import {
|
|||
PROPOSAL_ARBITER_STATUS,
|
||||
} from 'types';
|
||||
import { User } from 'types';
|
||||
import { getAmountError, isValidAddress } from 'utils/validators';
|
||||
import { getAmountError, isValidSaplingAddress, isValidTAddress, isValidSproutAddress } from 'utils/validators';
|
||||
import { Zat, toZat } from 'utils/units';
|
||||
import { ONE_DAY } from 'utils/time';
|
||||
import { PROPOSAL_CATEGORY, PROPOSAL_STAGE } from 'api/constants';
|
||||
|
@ -90,8 +90,14 @@ export function getCreateErrors(
|
|||
}
|
||||
|
||||
// Payout address
|
||||
if (payoutAddress && !isValidAddress(payoutAddress)) {
|
||||
errors.payoutAddress = 'That doesn’t look like a valid zcash address';
|
||||
if (payoutAddress && !isValidSaplingAddress(payoutAddress)) {
|
||||
if (isValidSproutAddress(payoutAddress)) {
|
||||
errors.payoutAddress = 'Must be a Sapling address, not a Sprout address';
|
||||
} else if (isValidTAddress(payoutAddress)) {
|
||||
errors.payoutAddress = 'Must be a Sapling Z address, not a T address';
|
||||
} else {
|
||||
errors.payoutAddress = 'That doesn’t look like a valid Sapling address';
|
||||
}
|
||||
}
|
||||
|
||||
// Milestones
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
export const DONATION = {
|
||||
ZCASH_TRANSPARENT: 't1aib2cbwPVrFfrjGGkhWD67imdBet1xDTr',
|
||||
ZCASH_SPROUT: 'zcWGwZU7FyUgpdrWGkeFqCEnvhLRDAVuf2ZbhW4vzNMTTR6VUgfiBGkiNbkC4e38QaPtS13RKZCriqN9VcyyKNRRQxbgnen',
|
||||
ZCASH_SAPLING: 'zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk',
|
||||
};
|
||||
|
|
|
@ -17,19 +17,29 @@ export function isValidEmail(email: string): boolean {
|
|||
return /\S+@\S+\.\S+/.test(email);
|
||||
}
|
||||
|
||||
|
||||
// Uses simple regex to validate addresses, doesn't check checksum or network
|
||||
export function isValidAddress(address: string): boolean {
|
||||
// T address
|
||||
export function isValidTAddress(address: string): boolean {
|
||||
if (/^t[a-zA-Z0-9]{34}$/.test(address)) {
|
||||
return true;
|
||||
}
|
||||
// Sprout address
|
||||
return false;
|
||||
}
|
||||
|
||||
export function isValidSproutAddress(address: string): boolean {
|
||||
if (/^z[a-zA-Z0-9]{94}$/.test(address)) {
|
||||
return true;
|
||||
}
|
||||
// Sapling address
|
||||
return false;
|
||||
}
|
||||
|
||||
export function isValidSaplingAddress(address: string): boolean {
|
||||
if (/^z(s)?(reg)?(testsapling)?[a-zA-Z0-9]{76}$/.test(address)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export function isValidAddress(a: string): boolean {
|
||||
return isValidTAddress(a) || isValidSproutAddress(a) || isValidSaplingAddress(a);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue