@@ -1675,39 +1675,119 @@ fn send_to_unknown_delegation(#[case] seed: Seed) {
1675
1675
let mut rng = make_seedable_rng ( seed) ;
1676
1676
let chain_config = Arc :: new ( create_mainnet ( ) ) ;
1677
1677
1678
- let mut wallet = create_wallet ( chain_config. clone ( ) ) ;
1678
+ let mut wallet = create_wallet_with_mnemonic ( chain_config. clone ( ) , MNEMONIC ) ;
1679
+ let mut wallet2 = create_wallet_with_mnemonic ( chain_config. clone ( ) , MNEMONIC2 ) ;
1679
1680
1680
1681
let coin_balance = get_coin_balance ( & wallet) ;
1681
1682
assert_eq ! ( coin_balance, Amount :: ZERO ) ;
1682
1683
1683
1684
// Generate a new block which sends reward to the wallet
1684
1685
let delegation_amount = Amount :: from_atoms ( rng. gen_range ( 2 ..100 ) ) ;
1685
1686
let block1_amount = delegation_amount;
1686
- let _ = create_block ( & chain_config, & mut wallet, vec ! [ ] , block1_amount, 0 ) ;
1687
+ let block_height = 0 ;
1688
+ let ( _, block) = create_block (
1689
+ & chain_config,
1690
+ & mut wallet,
1691
+ vec ! [ ] ,
1692
+ block1_amount,
1693
+ block_height,
1694
+ ) ;
1695
+
1696
+ scan_wallet (
1697
+ & mut wallet2,
1698
+ BlockHeight :: new ( block_height) ,
1699
+ vec ! [ block. clone( ) ] ,
1700
+ ) ;
1687
1701
1688
1702
let coin_balance = get_coin_balance ( & wallet) ;
1689
1703
assert_eq ! ( coin_balance, delegation_amount) ;
1704
+ let coin_balance = get_coin_balance ( & wallet2) ;
1705
+ assert_eq ! ( coin_balance, Amount :: ZERO ) ;
1690
1706
1691
- let unknown_delegation_id = DelegationId :: new ( H256 :: zero ( ) ) ;
1707
+ let block_height = 1 ;
1708
+ let ( _, block) = create_block (
1709
+ & chain_config,
1710
+ & mut wallet2,
1711
+ vec ! [ ] ,
1712
+ block1_amount,
1713
+ block_height,
1714
+ ) ;
1715
+
1716
+ scan_wallet (
1717
+ & mut wallet,
1718
+ BlockHeight :: new ( block_height) ,
1719
+ vec ! [ block. clone( ) ] ,
1720
+ ) ;
1721
+
1722
+ let coin_balance = get_coin_balance ( & wallet) ;
1723
+ assert_eq ! ( coin_balance, delegation_amount) ;
1724
+ let coin_balance = get_coin_balance ( & wallet2) ;
1725
+ assert_eq ! ( coin_balance, delegation_amount) ;
1726
+
1727
+ let unknown_pool_id = PoolId :: new ( H256 :: zero ( ) ) ;
1728
+ let address2 = wallet2. get_new_address ( DEFAULT_ACCOUNT_INDEX ) . unwrap ( ) . 1 ;
1729
+ let ( wallet2_delegation_id, delegation_tx) = wallet2
1730
+ . create_delegation (
1731
+ DEFAULT_ACCOUNT_INDEX ,
1732
+ vec ! [ make_create_delegation_output( address2. clone( ) , unknown_pool_id) ] ,
1733
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
1734
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
1735
+ )
1736
+ . unwrap ( ) ;
1737
+
1738
+ let block_height = 2 ;
1739
+ let ( _, block) = create_block (
1740
+ & chain_config,
1741
+ & mut wallet,
1742
+ vec ! [ delegation_tx] ,
1743
+ Amount :: ZERO ,
1744
+ block_height,
1745
+ ) ;
1746
+ scan_wallet (
1747
+ & mut wallet2,
1748
+ BlockHeight :: new ( block_height) ,
1749
+ vec ! [ block. clone( ) ] ,
1750
+ ) ;
1751
+
1752
+ let delegation_data =
1753
+ wallet2. get_delegation ( DEFAULT_ACCOUNT_INDEX , wallet2_delegation_id) . unwrap ( ) ;
1754
+ assert_eq ! ( delegation_data. pool_id, unknown_pool_id) ;
1755
+ assert_eq ! ( & delegation_data. destination, address2. as_object( ) ) ;
1756
+ assert ! ( delegation_data. not_staked_yet) ;
1757
+
1758
+ // Stake from wallet1 to wallet2's delegation
1692
1759
let delegation_stake_tx = wallet
1693
1760
. create_transaction_to_addresses (
1694
1761
DEFAULT_ACCOUNT_INDEX ,
1695
- [ TxOutput :: DelegateStaking ( delegation_amount, unknown_delegation_id ) ] ,
1762
+ [ TxOutput :: DelegateStaking ( delegation_amount, wallet2_delegation_id ) ] ,
1696
1763
SelectedInputs :: Utxos ( vec ! [ ] ) ,
1697
1764
BTreeMap :: new ( ) ,
1698
1765
FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
1699
1766
FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
1700
1767
)
1701
1768
. unwrap ( ) ;
1702
1769
1703
- let _ = create_block (
1770
+ let block_height = 3 ;
1771
+ let ( _, block) = create_block (
1704
1772
& chain_config,
1705
1773
& mut wallet,
1706
1774
vec ! [ delegation_stake_tx] ,
1707
1775
block1_amount,
1708
- 1 ,
1776
+ block_height,
1777
+ ) ;
1778
+ scan_wallet (
1779
+ & mut wallet2,
1780
+ BlockHeight :: new ( block_height) ,
1781
+ vec ! [ block. clone( ) ] ,
1709
1782
) ;
1710
1783
1784
+ // Wallet2 should see the transaction and know that someone has staked to the delegation
1785
+ let delegation_data =
1786
+ wallet2. get_delegation ( DEFAULT_ACCOUNT_INDEX , wallet2_delegation_id) . unwrap ( ) ;
1787
+ assert_eq ! ( delegation_data. pool_id, unknown_pool_id) ;
1788
+ assert_eq ! ( & delegation_data. destination, address2. as_object( ) ) ;
1789
+ assert ! ( !delegation_data. not_staked_yet) ;
1790
+
1711
1791
let coin_balance = get_coin_balance ( & wallet) ;
1712
1792
assert_eq ! ( coin_balance, block1_amount) ;
1713
1793
@@ -1984,7 +2064,8 @@ fn issue_and_transfer_tokens(#[case] seed: Seed) {
1984
2064
let mut rng = make_seedable_rng ( seed) ;
1985
2065
let chain_config = Arc :: new ( create_mainnet ( ) ) ;
1986
2066
1987
- let mut wallet = create_wallet ( chain_config. clone ( ) ) ;
2067
+ let mut wallet = create_wallet_with_mnemonic ( chain_config. clone ( ) , MNEMONIC ) ;
2068
+ let mut wallet2 = create_wallet_with_mnemonic ( chain_config. clone ( ) , MNEMONIC2 ) ;
1988
2069
1989
2070
let coin_balance = get_coin_balance ( & wallet) ;
1990
2071
assert_eq ! ( coin_balance, Amount :: ZERO ) ;
@@ -1998,36 +2079,53 @@ fn issue_and_transfer_tokens(#[case] seed: Seed) {
1998
2079
chain_config. nft_issuance_fee ( BlockHeight :: zero ( ) )
1999
2080
} ;
2000
2081
2001
- // Generate a new block which sends reward to the wallet
2002
- let mut block1_amount =
2003
- ( Amount :: from_atoms ( rng. gen_range ( NETWORK_FEE + 100 ..NETWORK_FEE + 10000 ) ) + issuance_fee)
2004
- . unwrap ( ) ;
2082
+ let some_coins = 100 ;
2083
+ // Generate a new block which sends reward to the wallet2
2084
+ let mut block1_amount = ( Amount :: from_atoms (
2085
+ rng. gen_range ( NETWORK_FEE + some_coins..NETWORK_FEE + some_coins * 100 ) ,
2086
+ ) + issuance_fee)
2087
+ . unwrap ( ) ;
2005
2088
2006
2089
if issue_fungible_token {
2007
2090
block1_amount =
2008
2091
( block1_amount + chain_config. token_supply_change_fee ( BlockHeight :: zero ( ) ) ) . unwrap ( ) ;
2009
2092
}
2010
2093
2011
- let _ = create_block ( & chain_config , & mut wallet, vec ! [ ] , block1_amount , 0 ) ;
2094
+ let token_authority_and_destination = wallet. get_new_address ( DEFAULT_ACCOUNT_INDEX ) . unwrap ( ) . 1 ;
2012
2095
2013
- let coin_balance = get_coin_balance ( & wallet) ;
2014
- assert_eq ! ( coin_balance, block1_amount) ;
2096
+ // Issue token randomly from wallet2 to wallet1 or wallet1 to wallet1
2097
+ let ( random_issuing_wallet, other_wallet) = if rng. gen :: < bool > ( ) {
2098
+ ( & mut wallet, & mut wallet2)
2099
+ } else {
2100
+ ( & mut wallet2, & mut wallet)
2101
+ } ;
2015
2102
2016
- let address2 = wallet. get_new_address ( DEFAULT_ACCOUNT_INDEX ) . unwrap ( ) . 1 ;
2103
+ let ( _, block) = create_block (
2104
+ & chain_config,
2105
+ random_issuing_wallet,
2106
+ vec ! [ ] ,
2107
+ block1_amount,
2108
+ 0 ,
2109
+ ) ;
2110
+ scan_wallet ( other_wallet, BlockHeight :: new ( 0 ) , vec ! [ block. clone( ) ] ) ;
2111
+
2112
+ let coin_balance = get_coin_balance ( random_issuing_wallet) ;
2113
+ assert_eq ! ( coin_balance, block1_amount) ;
2017
2114
2018
2115
let amount_fraction = ( block1_amount. into_atoms ( ) - NETWORK_FEE ) / 10 ;
2019
2116
let mut token_amount_to_issue = Amount :: from_atoms ( rng. gen_range ( 1 ..amount_fraction) ) ;
2020
2117
2021
- let ( issued_token_id, token_issuance_transaction ) = if issue_fungible_token {
2118
+ let ( issued_token_id, token_issuance_transactions ) = if issue_fungible_token {
2022
2119
let token_issuance = TokenIssuanceV1 {
2023
2120
token_ticker : "XXXX" . as_bytes ( ) . to_vec ( ) ,
2024
2121
number_of_decimals : rng. gen_range ( 1 ..18 ) ,
2025
2122
metadata_uri : "http://uri" . as_bytes ( ) . to_vec ( ) ,
2026
2123
total_supply : common:: chain:: tokens:: TokenTotalSupply :: Unlimited ,
2027
- authority : address2 . as_object ( ) . clone ( ) ,
2124
+ authority : token_authority_and_destination . as_object ( ) . clone ( ) ,
2028
2125
is_freezable : common:: chain:: tokens:: IsTokenFreezable :: No ,
2029
2126
} ;
2030
- let ( issued_token_id, token_issuance_transaction) = wallet
2127
+ // issue a new token from a random wallet 1 or 2 to a destination from wallet1
2128
+ let ( issued_token_id, token_issuance_transaction) = random_issuing_wallet
2031
2129
. issue_new_token (
2032
2130
DEFAULT_ACCOUNT_INDEX ,
2033
2131
TokenIssuance :: V1 ( token_issuance. clone ( ) ) ,
@@ -2049,37 +2147,68 @@ fn issue_and_transfer_tokens(#[case] seed: Seed) {
2049
2147
token_issuance. authority ,
2050
2148
) ;
2051
2149
2052
- wallet
2150
+ random_issuing_wallet
2053
2151
. add_account_unconfirmed_tx (
2054
2152
DEFAULT_ACCOUNT_INDEX ,
2055
2153
token_issuance_transaction. clone ( ) ,
2056
2154
& WalletEventsNoOp ,
2057
2155
)
2058
2156
. unwrap ( ) ;
2157
+ other_wallet
2158
+ . add_account_unconfirmed_tx (
2159
+ DEFAULT_ACCOUNT_INDEX ,
2160
+ token_issuance_transaction. clone ( ) ,
2161
+ & WalletEventsNoOp ,
2162
+ )
2163
+ . unwrap ( ) ;
2164
+
2165
+ // transfer the remaining coins from the random wallet to wallet1 so it can continue with
2166
+ // other transactions
2167
+ let transfer_tx = random_issuing_wallet
2168
+ . create_transaction_to_addresses (
2169
+ DEFAULT_ACCOUNT_INDEX ,
2170
+ [ TxOutput :: Transfer (
2171
+ OutputValue :: Coin ( ( block1_amount - issuance_fee) . unwrap ( ) ) ,
2172
+ token_authority_and_destination. as_object ( ) . clone ( ) ,
2173
+ ) ] ,
2174
+ SelectedInputs :: Utxos ( vec ! [ ] ) ,
2175
+ BTreeMap :: new ( ) ,
2176
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2177
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2178
+ )
2179
+ . unwrap ( ) ;
2180
+ wallet
2181
+ . add_account_unconfirmed_tx (
2182
+ DEFAULT_ACCOUNT_INDEX ,
2183
+ transfer_tx. clone ( ) ,
2184
+ & WalletEventsNoOp ,
2185
+ )
2186
+ . unwrap ( ) ;
2059
2187
2188
+ // wallet1 should know about the issued token from the random wallet
2060
2189
let unconfirmed_token_info =
2061
2190
wallet. get_token_unconfirmed_info ( DEFAULT_ACCOUNT_INDEX , & token_info) . unwrap ( ) ;
2062
2191
let mint_transaction = wallet
2063
2192
. mint_tokens (
2064
2193
DEFAULT_ACCOUNT_INDEX ,
2065
2194
& unconfirmed_token_info,
2066
2195
token_amount_to_issue,
2067
- address2 ,
2196
+ token_authority_and_destination ,
2068
2197
FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2069
2198
FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2070
2199
)
2071
2200
. unwrap ( ) ;
2072
2201
2073
2202
(
2074
2203
issued_token_id,
2075
- vec ! [ token_issuance_transaction, mint_transaction] ,
2204
+ vec ! [ token_issuance_transaction, transfer_tx , mint_transaction] ,
2076
2205
)
2077
2206
} else {
2078
2207
token_amount_to_issue = Amount :: from_atoms ( 1 ) ;
2079
- let ( issued_token_id, token_issuance_transaction ) = wallet
2208
+ let ( issued_token_id, nft_issuance_transaction ) = random_issuing_wallet
2080
2209
. issue_new_nft (
2081
2210
DEFAULT_ACCOUNT_INDEX ,
2082
- address2 ,
2211
+ token_authority_and_destination . clone ( ) ,
2083
2212
Metadata {
2084
2213
creator : None ,
2085
2214
name : "Name" . as_bytes ( ) . to_vec ( ) ,
@@ -2094,13 +2223,30 @@ fn issue_and_transfer_tokens(#[case] seed: Seed) {
2094
2223
FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2095
2224
)
2096
2225
. unwrap ( ) ;
2097
- ( issued_token_id, vec ! [ token_issuance_transaction] )
2226
+ random_issuing_wallet
2227
+ . add_unconfirmed_tx ( nft_issuance_transaction. clone ( ) , & WalletEventsNoOp )
2228
+ . unwrap ( ) ;
2229
+
2230
+ let transfer_tx = random_issuing_wallet
2231
+ . create_transaction_to_addresses (
2232
+ DEFAULT_ACCOUNT_INDEX ,
2233
+ [ TxOutput :: Transfer (
2234
+ OutputValue :: Coin ( ( block1_amount - issuance_fee) . unwrap ( ) ) ,
2235
+ token_authority_and_destination. as_object ( ) . clone ( ) ,
2236
+ ) ] ,
2237
+ SelectedInputs :: Utxos ( vec ! [ ] ) ,
2238
+ BTreeMap :: new ( ) ,
2239
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2240
+ FeeRate :: from_amount_per_kb ( Amount :: ZERO ) ,
2241
+ )
2242
+ . unwrap ( ) ;
2243
+ ( issued_token_id, vec ! [ nft_issuance_transaction, transfer_tx] )
2098
2244
} ;
2099
2245
2100
2246
let _ = create_block (
2101
2247
& chain_config,
2102
2248
& mut wallet,
2103
- token_issuance_transaction ,
2249
+ token_issuance_transactions ,
2104
2250
block1_amount,
2105
2251
1 ,
2106
2252
) ;
0 commit comments