Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
parity
Mirrored projects
polkadot
Commits
b7dd7d1e
Commit
b7dd7d1e
authored
Dec 23, 2020
by
Shawn Tabrizi
Browse files
allow contribution on behalf of another user
parent
b34cfd49
Pipeline
#117973
failed with stages
in 26 minutes and 2 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
runtime/common/src/crowdloan.rs
View file @
b7dd7d1e
...
...
@@ -304,7 +304,7 @@ decl_module! {
/// slot. It will be withdrawable in two instances: the parachain becomes retired; or the
/// slot is unable to be purchased and the timeout expires.
#[weight
=
0
]
fn
contribute
(
origin
,
#[compact]
index
:
FundIndex
,
#[compact]
value
:
BalanceOf
<
T
>
)
{
fn
contribute
(
origin
,
#[compact]
index
:
FundIndex
,
#[compact]
value
:
BalanceOf
<
T
>
,
return_to
:
T
::
AccountId
)
{
let
who
=
ensure_signed
(
origin
)
?
;
ensure!
(
value
>=
T
::
MinContribution
::
get
(),
Error
::
<
T
>
::
ContributionTooSmall
);
...
...
@@ -318,9 +318,9 @@ decl_module! {
T
::
Currency
::
transfer
(
&
who
,
&
Self
::
fund_account_id
(
index
),
value
,
AllowDeath
)
?
;
let
balance
=
Self
::
contribution_get
(
index
,
&
wh
o
);
let
balance
=
Self
::
contribution_get
(
index
,
&
return_t
o
);
let
balance
=
balance
.saturating_add
(
value
);
Self
::
contribution_put
(
index
,
&
wh
o
,
&
balance
);
Self
::
contribution_put
(
index
,
&
return_t
o
,
&
balance
);
if
<
slots
::
Module
<
T
>>
::
is_ending
(
now
)
.is_some
()
{
match
fund
.last_contribution
{
...
...
@@ -352,7 +352,7 @@ decl_module! {
<
Funds
<
T
>>
::
insert
(
index
,
&
fund
);
Self
::
deposit_event
(
RawEvent
::
Contributed
(
wh
o
,
index
,
value
));
Self
::
deposit_event
(
RawEvent
::
Contributed
(
return_t
o
,
index
,
value
));
}
/// Set the deploy data of the funded parachain if not already set. Once set, this cannot
...
...
@@ -846,7 +846,7 @@ mod tests {
assert_eq!
(
Crowdloan
::
contribution_get
(
0
,
&
1
),
0
);
// User 1 contributes to their own crowdloan
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
,
1
));
// User 1 has spent some funds to do this, transfer fees **are** taken
assert_eq!
(
Balances
::
free_balance
(
1
),
950
);
// Contributions are stored in the trie
...
...
@@ -868,22 +868,22 @@ mod tests {
fn
contribute_handles_basic_errors
()
{
new_test_ext
()
.execute_with
(||
{
// Cannot contribute to non-existing fund
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
),
Error
::
<
Test
>
::
InvalidFundIndex
);
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
,
1
),
Error
::
<
Test
>
::
InvalidFundIndex
);
// Cannot contribute below minimum contribution
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
9
),
Error
::
<
Test
>
::
ContributionTooSmall
);
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
9
,
1
),
Error
::
<
Test
>
::
ContributionTooSmall
);
// Set up a crowdloan
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
101
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
101
,
1
));
// Cannot contribute past the limit
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
900
),
Error
::
<
Test
>
::
CapExceeded
);
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
900
,
2
),
Error
::
<
Test
>
::
CapExceeded
);
// Move past end date
run_to_block
(
10
);
// Cannot contribute to ended fund
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
),
Error
::
<
Test
>
::
ContributionPeriodOver
);
assert_noop!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
,
1
),
Error
::
<
Test
>
::
ContributionPeriodOver
);
});
}
...
...
@@ -982,7 +982,7 @@ mod tests {
));
// Fund crowdloan
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
,
2
));
run_to_block
(
10
);
...
...
@@ -1009,7 +1009,7 @@ mod tests {
assert_eq!
(
Balances
::
free_balance
(
1
),
999
);
// Fund crowdloan
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
,
2
));
run_to_block
(
10
);
...
...
@@ -1056,7 +1056,7 @@ mod tests {
));
// Fund crowdloan
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
,
2
));
run_to_block
(
10
);
...
...
@@ -1099,7 +1099,7 @@ mod tests {
));
// Fund crowdloan
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
1000
,
2
));
run_to_block
(
10
);
...
...
@@ -1133,9 +1133,9 @@ mod tests {
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Transfer fee is taken here
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
,
1
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
,
2
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
,
3
));
// Skip all the way to the end
run_to_block
(
50
);
...
...
@@ -1152,6 +1152,27 @@ mod tests {
});
}
#[test]
fn
withdraw_other_works
()
{
// User will contribute on behalf of another user
new_test_ext
()
.execute_with
(||
{
// Set up a crowdloan
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Transfer fee is taken here
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
,
4
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
,
4
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
,
4
));
// Skip all the way to the end
run_to_block
(
50
);
// User can withdraw their full balance without fees
assert_ok!
(
Crowdloan
::
withdraw
(
Origin
::
signed
(
4
),
0
));
assert_eq!
(
Balances
::
free_balance
(
4
),
4600
);
});
}
#[test]
fn
withdraw_handles_basic_errors
()
{
new_test_ext
()
.execute_with
(||
{
...
...
@@ -1159,7 +1180,7 @@ mod tests {
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Transfer fee is taken here
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
,
1
));
assert_eq!
(
Balances
::
free_balance
(
1
),
950
);
run_to_block
(
5
);
...
...
@@ -1183,9 +1204,9 @@ mod tests {
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Transfer fee is taken here
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
,
1
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
,
2
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
,
3
));
// Skip all the way to the end
run_to_block
(
50
);
...
...
@@ -1220,9 +1241,9 @@ mod tests {
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Transfer fee is taken here
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
100
,
1
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
2
),
0
,
200
,
2
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
3
),
0
,
300
,
3
));
// Cannot dissolve an invalid fund index
assert_noop!
(
Crowdloan
::
dissolve
(
Origin
::
signed
(
1
),
1
),
Error
::
<
Test
>
::
InvalidFundIndex
);
...
...
@@ -1252,7 +1273,7 @@ mod tests {
// Create a crowdloan before an auction is created
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
1
),
1000
,
1
,
4
,
9
));
// Users can already contribute
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
49
,
1
));
// Fund added to NewRaise
assert_eq!
(
Crowdloan
::
new_raise
(),
vec!
[
0
]);
...
...
@@ -1296,8 +1317,8 @@ mod tests {
assert_ok!
(
Crowdloan
::
create
(
Origin
::
signed
(
2
),
1000
,
1
,
4
,
30
));
// Contribute to all, but more money to 0, less to 1
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
300
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
1
,
200
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
0
,
300
,
1
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
1
,
200
,
1
));
// Add deploy data to all
assert_ok!
(
Crowdloan
::
fix_deploy_data
(
...
...
@@ -1329,7 +1350,7 @@ mod tests {
// Create a second auction
assert_ok!
(
Slots
::
new_auction
(
Origin
::
root
(),
5
,
1
));
// Contribute to existing funds add to NewRaise
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
1
,
10
));
assert_ok!
(
Crowdloan
::
contribute
(
Origin
::
signed
(
1
),
1
,
10
,
1
));
// End the current auction, fund 1 wins!
run_to_block
(
20
);
...
...
Shawn Tabrizi
@shawntabrizi
mentioned in commit
eea79277
·
Jan 09, 2021
mentioned in commit
eea79277
mentioned in commit eea792774d11de9085b852038099c86bd3476d17
Toggle commit list
Shawn Tabrizi
@shawntabrizi
mentioned in commit
9dd75c5c
·
Jan 11, 2021
mentioned in commit
9dd75c5c
mentioned in commit 9dd75c5c4c43e3d56ccef36ecfa9d01e4b3a30d7
Toggle commit list
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment