Skip to content

Commit

Permalink
impl get_or_create_nft function
Browse files Browse the repository at this point in the history
  • Loading branch information
laruh committed Apr 29, 2024
1 parent 9a23f20 commit 942d139
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 13 deletions.
4 changes: 2 additions & 2 deletions mm2src/coins/lp_coins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3398,7 +3398,7 @@ pub struct MmCoinStruct {
}

impl MmCoinStruct {
fn new(coin: MmCoinEnum) -> Self {
pub fn new(coin: MmCoinEnum) -> Self {
Self {
inner: coin,
is_available: AtomicBool::new(true).into(),
Expand Down Expand Up @@ -3501,7 +3501,7 @@ impl DexFee {
pub struct CoinsContext {
/// A map from a currency ticker symbol to the corresponding coin.
/// Similar to `LP_coins`.
coins: AsyncMutex<HashMap<String, MmCoinStruct>>,
pub coins: AsyncMutex<HashMap<String, MmCoinStruct>>,
balance_update_handlers: AsyncMutex<Vec<Box<dyn BalanceTradeFeeUpdatedHandler + Send + Sync>>>,
account_balance_task_manager: AccountBalanceTaskManagerShared,
create_account_manager: CreateAccountTaskManagerShared,
Expand Down
1 change: 1 addition & 0 deletions mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ lazy_static! {
// Supply more privkeys when 18 will be not enough.
pub static ref SLP_TOKEN_OWNERS: Mutex<Vec<[u8; 32]>> = Mutex::new(Vec::with_capacity(18));
pub static ref MM_CTX: MmArc = MmCtxBuilder::new().into_mm_arc();
pub static ref MM_CTX1: MmArc = MmCtxBuilder::new().into_mm_arc();
pub static ref GETH_WEB3: Web3<Http> = Web3::new(Http::new(GETH_RPC_URL).unwrap());
pub static ref SEPOLIA_WEB3: Web3<Http> = Web3::new(Http::new(SEPOLIA_RPC_URL).unwrap());
// Mutex used to prevent nonce re-usage during funding addresses used in tests
Expand Down
46 changes: 35 additions & 11 deletions mm2src/mm2_main/tests/docker_tests/eth_docker_tests.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
use super::docker_tests_common::{random_secp256k1_secret, ERC1155_TEST_ABI, ERC721_TEST_ABI, GETH_ACCOUNT,
GETH_ERC1155_CONTRACT, GETH_ERC20_CONTRACT, GETH_ERC721_CONTRACT,
GETH_NFT_MAKER_SWAP_V2, GETH_NFT_SWAP_CONTRACT, GETH_NONCE_LOCK, GETH_RPC_URL,
GETH_SWAP_CONTRACT, GETH_WATCHERS_SWAP_CONTRACT, GETH_WEB3, MM_CTX,
GETH_SWAP_CONTRACT, GETH_WATCHERS_SWAP_CONTRACT, GETH_WEB3, MM_CTX, MM_CTX1,
SEPOLIA_ERC1155_CONTRACT, SEPOLIA_ERC721_CONTRACT, SEPOLIA_ETOMIC_MAKER_NFT_SWAP_V2,
SEPOLIA_NONCE_LOCK, SEPOLIA_RPC_URL, SEPOLIA_WEB3};
use crate::common::Future01CompatExt;
use bitcrypto::{dhash160, sha256};
use coins::eth::{checksum_address, eth_addr_to_hex, eth_coin_from_conf_and_request, Action, EthCoin, SignedEthTx,
ERC20_ABI};
use coins::nft::nft_structs::{Chain, ContractType, NftInfo};
use coins::{CoinProtocol, CoinWithDerivationMethod, ConfirmPaymentInput, DerivationMethod, FoundSwapTxSpend,
MakerNftSwapOpsV2, MarketCoinOps, NftSwapInfo, ParseCoinAssocTypes, PrivKeyBuildPolicy, RefundPaymentArgs,
SearchForSwapTxSpendInput, SendNftMakerPaymentArgs, SendPaymentArgs, SpendNftMakerPaymentArgs,
SpendPaymentArgs, SwapOps, SwapTxTypeWithSecretHash, ToBytes, Transaction, ValidateNftMakerPaymentArgs};
use coins::{lp_coinfind, CoinProtocol, CoinWithDerivationMethod, CoinsContext, ConfirmPaymentInput, DerivationMethod,
FoundSwapTxSpend, MakerNftSwapOpsV2, MarketCoinOps, MmCoinEnum, MmCoinStruct, NftSwapInfo,
ParseCoinAssocTypes, PrivKeyBuildPolicy, RefundPaymentArgs, SearchForSwapTxSpendInput,
SendNftMakerPaymentArgs, SendPaymentArgs, SpendNftMakerPaymentArgs, SpendPaymentArgs, SwapOps,
SwapTxTypeWithSecretHash, ToBytes, Transaction, ValidateNftMakerPaymentArgs};
use common::{block_on, now_sec};
use crypto::Secp256k1Secret;
use ethereum_types::U256;
use futures01::Future;
use mm2_core::mm_ctx::MmArc;
use mm2_number::{BigDecimal, BigUint};
use mm2_test_helpers::for_tests::{erc20_dev_conf, eth_dev_conf, nft_dev_conf, nft_sepolia_conf};
use std::thread;
Expand All @@ -27,6 +29,7 @@ use web3::types::{Address, BlockNumber, TransactionRequest, H256};

const SEPOLIA_MAKER_PRIV: &str = "6e2f3a6223b928a05a3a3622b0c3f3573d03663b704a61a6eb73326de0487928";
const SEPOLIA_TAKER_PRIV: &str = "e0be82dca60ff7e4c6d6db339ac9e1ae249af081dba2110bddd281e711608f16";
const NFT_ETH: &str = "NFT_ETH";

/// # Safety
///
Expand Down Expand Up @@ -381,6 +384,7 @@ pub fn global_nft_with_random_privkey(swap_contract_address: Address, nft_type:
}

fn global_nft_from_privkey(
ctx: &MmArc,
swap_contract_address: Address,
secret: &'static str,
nft_type: Option<TestNftType>,
Expand All @@ -395,8 +399,8 @@ fn global_nft_from_privkey(

let priv_key = Secp256k1Secret::from(secret);
let global_nft = block_on(eth_coin_from_conf_and_request(
&MM_CTX,
"NFT_ETH",
ctx,
NFT_ETH,
&nft_conf,
&req,
CoinProtocol::NFT {
Expand All @@ -406,6 +410,13 @@ fn global_nft_from_privkey(
))
.unwrap();

let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap();
let mut coins = block_on(coins_ctx.coins.lock());
coins.insert(
global_nft.ticker().into(),
MmCoinStruct::new(MmCoinEnum::EthCoin(global_nft.clone())),
);

if let Some(nft_type) = nft_type {
match nft_type {
TestNftType::Erc1155 { token_id, amount } => {
Expand Down Expand Up @@ -839,14 +850,27 @@ fn wait_pending_transactions(wallet_address: Address) {
}
}

fn get_or_create_nft(ctx: &MmArc, priv_key: &'static str, nft_type: Option<TestNftType>) -> EthCoin {
match block_on(lp_coinfind(ctx, NFT_ETH)).unwrap() {
None => {
let nft = global_nft_from_privkey(ctx, sepolia_etomic_maker_nft(), priv_key, nft_type);
nft
},
Some(mm_coin) => match mm_coin {
MmCoinEnum::EthCoin(nft) => nft,
_ => panic!("Unexpected coin type found. Expected MmCoinEnum::EthCoin"),
},
}
}

#[test]
fn send_and_spend_erc721_maker_payment() {
// Sepolia Maker owns tokenId = 1

let erc721_nft = TestNftType::Erc721 { token_id: 1 };

let maker_global_nft = global_nft_from_privkey(sepolia_etomic_maker_nft(), SEPOLIA_MAKER_PRIV, Some(erc721_nft));
let taker_global_nft = global_nft_from_privkey(sepolia_etomic_maker_nft(), SEPOLIA_TAKER_PRIV, None);
let maker_global_nft = get_or_create_nft(&MM_CTX, SEPOLIA_MAKER_PRIV, Some(erc721_nft));
let taker_global_nft = get_or_create_nft(&MM_CTX1, SEPOLIA_TAKER_PRIV, None);

let maker_address = block_on(maker_global_nft.my_addr());
wait_pending_transactions(maker_address);
Expand Down Expand Up @@ -953,8 +977,8 @@ fn send_and_spend_erc1155_maker_payment() {

let erc1155_nft = TestNftType::Erc1155 { token_id: 1, amount: 3 };

let maker_global_nft = global_nft_from_privkey(sepolia_etomic_maker_nft(), SEPOLIA_MAKER_PRIV, Some(erc1155_nft));
let taker_global_nft = global_nft_from_privkey(sepolia_etomic_maker_nft(), SEPOLIA_TAKER_PRIV, None);
let maker_global_nft = get_or_create_nft(&MM_CTX, SEPOLIA_MAKER_PRIV, Some(erc1155_nft));
let taker_global_nft = get_or_create_nft(&MM_CTX1, SEPOLIA_TAKER_PRIV, None);

let time_lock = now_sec() + 1000;
let maker_pubkey = maker_global_nft.derive_htlc_pubkey(&[]);
Expand Down

0 comments on commit 942d139

Please sign in to comment.