diff --git a/Cargo.lock b/Cargo.lock index eb7aabb7b8..b2ea9186d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4505,9 +4505,9 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0452aac8bab02242429380e9b2f94ea20cea2b37e2c1777a1358799bbe97f37" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", "base64 0.13.0", diff --git a/cmd/airdrop/src/main.rs b/cmd/airdrop/src/main.rs index f5a0523c4e..10519303b8 100644 --- a/cmd/airdrop/src/main.rs +++ b/cmd/airdrop/src/main.rs @@ -126,13 +126,56 @@ async fn main() -> Result<()> { .try_into()?; let is_stc = stc_type_tag().eq(&TypeTag::Struct(token_type.clone())); + let mut total_amount = 0u128; let airdrop_infos: Vec = { let mut csv_reader = csv::ReaderBuilder::default() .has_headers(false) .from_path(airdrop_file.as_path())?; let mut leafs = Vec::with_capacity(4096); - for record in csv_reader.deserialize() { - let data: AirdropInfo = record?; + for (idx, record) in csv_reader.records().enumerate() { + let record = record?; + if record.iter().all(|part| part.trim().is_empty()) { + //just skip empty line + continue; + } + match record.len().cmp(&2) { + std::cmp::Ordering::Equal => {} + std::cmp::Ordering::Greater => { + println!( + "[WARN] invalid record: line {}, {:?}, ignore extra field.", + idx, record + ); + } + std::cmp::Ordering::Less => { + println!("[WARN] invalid record: line {}, {:?}, skip.", idx, record); + continue; + } + } + let address = match AccountAddress::from_str(record[0].trim()) { + Ok(address) => address, + Err(err) => { + if idx == 0 { + println!("[INFO] skip header line: {}", record.as_slice()); + } else { + println!( + "[WARN] invalid record: line {}, {:?}, skip. {}", + idx, record, err + ); + } + continue; + } + }; + let amount = match u128::from_str(record[1].trim()) { + Ok(amount) => amount, + Err(err) => { + println!( + "[WARN] invalid record: line {}, {:?}, skip. {}", + idx, record, err + ); + continue; + } + }; + let data = AirdropInfo { address, amount }; if !is_stc && !is_accept_token(data.address, token_type.clone(), &state_client).await? { println!( "{} does not accepted the token {}, skip.", @@ -140,11 +183,20 @@ async fn main() -> Result<()> { ); continue; } + total_amount += data.amount; leafs.push(data); } leafs }; + println!( + "airdrop {} token {} to {} addresses, total amount: {}", + token_type, + batch_size, + airdrop_infos.len(), + total_amount + ); + let private_key: AccountPrivateKey = { let pass = rpassword::prompt_password_stdout("Please Input Private Key: ")?; AccountPrivateKey::from_encoded_string(pass.trim())? @@ -239,7 +291,7 @@ async fn main() -> Result<()> { } }; if txn_info.status != TransactionStatusView::Executed { - eprintln!( + println!( "txn {:?} error: {:?}, please resume from user: {}", txn_hash, txn_info, diff --git a/scripts/import_snapshot.sh b/scripts/import_snapshot.sh index 32dcb558ca..5030345ff5 100755 --- a/scripts/import_snapshot.sh +++ b/scripts/import_snapshot.sh @@ -42,12 +42,12 @@ function import_snapshot() { download "$net" "$from_dir" - ./starcoin_db_exporter apply-snapshot -i "$from_dir" -n "$net" -o "$to_dir" - case_status=$? - if [ $case_status -ne 0 ]; then - echo -e "apply-snapshot $net $from_dir fail" - exit $case_status - fi + ./starcoin_db_exporter apply-snapshot -i "$from_dir"/snapshot -n "$net" -o "$to_dir" + case_status=$? + if [ $case_status -ne 0 ]; then + echo -e "apply-snapshot $net $from_dir fail" + exit $case_status + fi echo -e "$net apply-snapshot succ" } diff --git a/vm/natives/Cargo.toml b/vm/natives/Cargo.toml index b46c918141..a5955c3b35 100644 --- a/vm/natives/Cargo.toml +++ b/vm/natives/Cargo.toml @@ -21,7 +21,7 @@ log = "0.4.14" walkdir = "2.3.1" smallvec = "1.8.1" tiny-keccak={version="2", features = ["keccak"]} -libsecp256k1 = "0.7.0" +libsecp256k1 = "0.7.1" arrayref = "0.3" ripemd160 = "0.9.1" num_enum = "0.5.7"