#[test_only]
module battle_addr::nft_ownership_theft_test {
use std::signer;
use aptos_framework::account;
use aptos_framework::timestamp;
use aptos_framework::coin;
use aptos_framework::object;
use aptos_token_v2::token::Token;
use battle_addr::rap_battle;
use battle_addr::one_shot;
use battle_addr::cred_token::{Self, CRED};
#[test(framework = @0x1, module_owner = @battle_addr, defender = @0x100, challenger = @0x200)]
fun test_winner_steals_loser_nft_ownership(
framework: &signer,
module_owner: &signer,
defender: &signer,
challenger: &signer
) {
timestamp::set_time_has_started_for_testing(framework);
account::create_account_for_test(signer::address_of(module_owner));
account::create_account_for_test(signer::address_of(defender));
account::create_account_for_test(signer::address_of(challenger));
rap_battle::init_module(module_owner);
one_shot::init_module(module_owner);
cred_token::init_module(module_owner);
cred_token::register(defender);
cred_token::register(challenger);
cred_token::mint(module_owner, signer::address_of(defender), 1000);
cred_token::mint(module_owner, signer::address_of(challenger), 1000);
one_shot::mint_rapper(module_owner, signer::address_of(defender));
one_shot::mint_rapper(module_owner, signer::address_of(challenger));
let def_addr = signer::address_of(defender);
let chall_addr = signer::address_of(challenger);
assert!(one_shot::balance_of(def_addr) == 1, 1);
assert!(one_shot::balance_of(chall_addr) == 1, 2);
let defender_token = create_test_token(defender);
let challenger_token = create_test_token(challenger);
rap_battle::go_on_stage_or_battle(defender, defender_token, 100);
assert!(one_shot::balance_of(@battle_addr) == 1, 3);
assert!(one_shot::balance_of(def_addr) == 0, 4);
assert!(one_shot::balance_of(chall_addr) == 1, 5);
timestamp::update_global_time_for_test(150 * 1000000);
rap_battle::go_on_stage_or_battle(challenger, challenger_token, 100);
assert!(one_shot::balance_of(chall_addr) == 2, 6);
assert!(one_shot::balance_of(def_addr) == 0, 7);
assert!(one_shot::balance_of(@battle_addr) == 0, 8);
}
#[test(framework = @0x1, module_owner = @battle_addr, defender = @0x100, challenger = @0x200)]
fun test_defender_wins_steals_challenger_nft(
framework: &signer,
module_owner: &signer,
defender: &signer,
challenger: &signer
) {
timestamp::set_time_has_started_for_testing(framework);
account::create_account_for_test(signer::address_of(module_owner));
account::create_account_for_test(signer::address_of(defender));
account::create_account_for_test(signer::address_of(challenger));
rap_battle::init_module(module_owner);
one_shot::init_module(module_owner);
cred_token::init_module(module_owner);
cred_token::register(defender);
cred_token::register(challenger);
cred_token::mint(module_owner, signer::address_of(defender), 1000);
cred_token::mint(module_owner, signer::address_of(challenger), 1000);
one_shot::mint_rapper(module_owner, signer::address_of(defender));
one_shot::mint_rapper(module_owner, signer::address_of(challenger));
let def_addr = signer::address_of(defender);
let chall_addr = signer::address_of(challenger);
assert!(one_shot::balance_of(def_addr) == 1, 1);
assert!(one_shot::balance_of(chall_addr) == 1, 2);
let defender_token = create_test_token(defender);
let challenger_token = create_test_token(challenger);
rap_battle::go_on_stage_or_battle(defender, defender_token, 100);
timestamp::update_global_time_for_test(125 * 1000000);
rap_battle::go_on_stage_or_battle(challenger, challenger_token, 100);
assert!(one_shot::balance_of(def_addr) == 2, 3);
assert!(one_shot::balance_of(chall_addr) == 0, 4);
assert!(coin::balance<CRED>(def_addr) == 1100, 5);
}
#[test(framework = @0x1, module_owner = @battle_addr, player1 = @0x100, player2 = @0x200, player3 = @0x300)]
fun test_nft_accumulation_exploit(
framework: &signer,
module_owner: &signer,
player1: &signer,
player2: &signer,
player3: &signer
) {
timestamp::set_time_has_started_for_testing(framework);
account::create_account_for_test(signer::address_of(module_owner));
account::create_account_for_test(signer::address_of(player1));
account::create_account_for_test(signer::address_of(player2));
account::create_account_for_test(signer::address_of(player3));
rap_battle::init_module(module_owner);
one_shot::init_module(module_owner);
cred_token::init_module(module_owner);
let players = vector[player1, player2, player3];
let i = 0;
while (i < 3) {
let player = *vector::borrow(&players, i);
cred_token::register(player);
cred_token::mint(module_owner, signer::address_of(player), 1000);
one_shot::mint_rapper(module_owner, signer::address_of(player));
i = i + 1;
};
let p1_addr = signer::address_of(player1);
let p1_token = create_test_token(player1);
let p2_token = create_test_token(player2);
rap_battle::go_on_stage_or_battle(player2, p2_token, 100);
timestamp::update_global_time_for_test(150 * 1000000);
rap_battle::go_on_stage_or_battle(player1, p1_token, 100);
assert!(one_shot::balance_of(p1_addr) == 2, 1);
let p1_token2 = create_test_token(player1);
let p3_token = create_test_token(player3);
rap_battle::go_on_stage_or_battle(player3, p3_token, 100);
timestamp::update_global_time_for_test(250 * 1000000);
rap_battle::go_on_stage_or_battle(player1, p1_token2, 100);
assert!(one_shot::balance_of(p1_addr) == 3, 2);
assert!(one_shot::balance_of(signer::address_of(player2)) == 0, 3);
assert!(one_shot::balance_of(signer::address_of(player3)) == 0, 4);
}
fun create_test_token(owner: &signer): object::Object<Token> {
abort 99
}
}