mirror of
https://github.com/serai-dex/serai.git
synced 2025-01-09 12:29:27 +00:00
92 lines
2.7 KiB
Rust
92 lines
2.7 KiB
Rust
|
use std::{
|
||
|
collections::{HashSet, HashMap},
|
||
|
str::FromStr,
|
||
|
};
|
||
|
|
||
|
use rand_core::{RngCore, OsRng};
|
||
|
|
||
|
use monero_rpc::{
|
||
|
monero::{Amount, Address},
|
||
|
TransferOptions,
|
||
|
};
|
||
|
|
||
|
use monero_serai::{
|
||
|
wallet::address::{Network, AddressSpec, SubaddressIndex},
|
||
|
wallet::Scanner,
|
||
|
};
|
||
|
|
||
|
mod runner;
|
||
|
|
||
|
async fn test_from_wallet_rpc_to_self(spec: AddressSpec) {
|
||
|
let wallet_rpc =
|
||
|
monero_rpc::RpcClientBuilder::new().build("http://127.0.0.1:6061").unwrap().wallet();
|
||
|
let daemon_rpc = runner::rpc().await;
|
||
|
|
||
|
// initialize wallet rpc
|
||
|
let address_resp = wallet_rpc.get_address(0, None).await;
|
||
|
let wallet_rpc_addr = if address_resp.is_ok() {
|
||
|
address_resp.unwrap().address
|
||
|
} else {
|
||
|
wallet_rpc.create_wallet("test_wallet".to_string(), None, "English".to_string()).await.unwrap();
|
||
|
let addr = wallet_rpc.get_address(0, None).await.unwrap().address;
|
||
|
daemon_rpc.generate_blocks(&addr.to_string(), 70).await.unwrap();
|
||
|
addr
|
||
|
};
|
||
|
|
||
|
// make an addr
|
||
|
let (_, view_pair, _) = runner::random_address();
|
||
|
let addr = Address::from_str(&view_pair.address(Network::Mainnet, spec).to_string()[..]).unwrap();
|
||
|
|
||
|
// refresh & make a tx
|
||
|
wallet_rpc.refresh(None).await.unwrap();
|
||
|
let tx = wallet_rpc
|
||
|
.transfer(
|
||
|
HashMap::from([(addr, Amount::ONE_XMR)]),
|
||
|
monero_rpc::TransferPriority::Default,
|
||
|
TransferOptions::default(),
|
||
|
)
|
||
|
.await
|
||
|
.unwrap();
|
||
|
let tx_hash: [u8; 32] = tx.tx_hash.0.try_into().unwrap();
|
||
|
|
||
|
// unlock it
|
||
|
runner::mine_until_unlocked(&daemon_rpc, &wallet_rpc_addr.to_string(), tx_hash).await;
|
||
|
|
||
|
// create the scanner
|
||
|
let mut scanner = Scanner::from_view(view_pair, Some(HashSet::new()));
|
||
|
if let AddressSpec::Subaddress(index) = spec {
|
||
|
scanner.register_subaddress(index);
|
||
|
}
|
||
|
|
||
|
// retrieve it and confirm
|
||
|
let tx = daemon_rpc.get_transaction(tx_hash).await.unwrap();
|
||
|
let output = scanner.scan_transaction(&tx).not_locked().swap_remove(0);
|
||
|
|
||
|
match spec {
|
||
|
AddressSpec::Subaddress(index) => assert_eq!(output.metadata.subaddress, Some(index)),
|
||
|
AddressSpec::Integrated(payment_id) => {
|
||
|
assert_eq!(output.metadata.payment_id, payment_id);
|
||
|
assert_eq!(output.metadata.subaddress, None);
|
||
|
}
|
||
|
_ => assert_eq!(output.metadata.subaddress, None),
|
||
|
}
|
||
|
assert_eq!(output.commitment().amount, 1000000000000);
|
||
|
}
|
||
|
|
||
|
async_sequential!(
|
||
|
async fn test_receipt_of_wallet_rpc_tx_standard() {
|
||
|
test_from_wallet_rpc_to_self(AddressSpec::Standard).await;
|
||
|
}
|
||
|
|
||
|
async fn test_receipt_of_wallet_rpc_tx_subaddress() {
|
||
|
test_from_wallet_rpc_to_self(AddressSpec::Subaddress(SubaddressIndex::new(0, 1).unwrap()))
|
||
|
.await;
|
||
|
}
|
||
|
|
||
|
async fn test_receipt_of_wallet_rpc_tx_integrated() {
|
||
|
let mut payment_id = [0u8; 8];
|
||
|
OsRng.fill_bytes(&mut payment_id);
|
||
|
test_from_wallet_rpc_to_self(AddressSpec::Integrated(payment_id)).await;
|
||
|
}
|
||
|
);
|