Skip to content

Commit

Permalink
all test pass + started dNFT impl
Browse files Browse the repository at this point in the history
  • Loading branch information
GustaveCharles committed Aug 26, 2023
1 parent 1080725 commit 4ac426f
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 90 deletions.
2 changes: 0 additions & 2 deletions Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,5 @@ casm = true
# TODO: Make Starknet version configurable
starknet = ">=2.1.0"
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.4.0" }


[tool.snforge]
exit_first = false
66 changes: 5 additions & 61 deletions src/token/erc721/erc721.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,6 @@ trait IERC721<TState> {
fn balance_of(self: @TState, account: ContractAddress) -> u256;
fn owner_of(self: @TState, token_id: u256) -> ContractAddress;
fn transfer_from(ref self: TState, from: ContractAddress, to: ContractAddress, token_id: u256);
// fn safe_transfer_from(
// ref self: TState,
// from: ContractAddress,
// to: ContractAddress,
// token_id: u256,
// data: Span<felt252>
// );
fn approve(ref self: TState, to: ContractAddress, token_id: u256);
fn set_approval_for_all(ref self: TState, operator: ContractAddress, approved: bool);
fn get_approved(self: @TState, token_id: u256) -> ContractAddress;
Expand All @@ -27,6 +20,11 @@ trait IERC721<TState> {
) -> bool;
}

#[starknet::interface]
trait IERC721Metadata<TState>{
fn token_uri(self: @TState, token_id: u256) -> felt252;
}

#[starknet::contract]
mod ERC721 {
use array::SpanTrait;
Expand Down Expand Up @@ -160,19 +158,6 @@ mod ERC721 {
self._transfer(from, to, token_id);
}

// fn safe_transfer_from(
// ref self: ContractState,
// from: ContractAddress,
// to: ContractAddress,
// token_id: u256,
// data: Span<felt252>
// ) {
// assert(
// self._is_approved_or_owner(get_caller_address(), token_id),
// 'ERC721: unauthorized caller'
// );
// self._safe_transfer(from, to, token_id, data);
// }
}

//
Expand Down Expand Up @@ -266,50 +251,9 @@ mod ERC721 {
self.emit(Transfer { from: owner, to: Zeroable::zero(), token_id });
}

// fn _safe_mint(
// ref self: ContractState, to: ContractAddress, token_id: u256, data: Span<felt252>
// ) {
// self._mint(to, token_id);
// assert(
// _check_on_erc721_received(Zeroable::zero(), to, token_id, data),
// 'ERC721: safe mint failed'
// );
// }

// fn _safe_transfer(
// ref self: ContractState,
// from: ContractAddress,
// to: ContractAddress,
// token_id: u256,
// data: Span<felt252>
// ) {
// self._transfer(from, to, token_id);
// assert(
// _check_on_erc721_received(from, to, token_id, data), 'ERC721: safe transfer failed'
// );
// }

fn _set_token_uri(ref self: ContractState, token_id: u256, token_uri: felt252) {
assert(self._exists(token_id), 'ERC721: invalid token ID');
self._token_uri.write(token_id, token_uri)
}
}

// #[internal]
// fn _check_on_erc721_received(
// from: ContractAddress, to: ContractAddress, token_id: u256, data: Span<felt252>
// ) -> bool {
// if (DualCaseSRC5 {
// contract_address: to
// }.supports_interface(interface::IERC721_RECEIVER_ID)) {
// DualCaseERC721Receiver {
// contract_address: to
// }
// .on_erc721_received(
// get_caller_address(), from, token_id, data
// ) == interface::IERC721_RECEIVER_ID
// } else {
// DualCaseSRC5 { contract_address: to }.supports_interface(account::interface::ISRC6_ID)
// }
// }
}
7 changes: 0 additions & 7 deletions src/token/erc721/interface.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,6 @@ trait IERC721<TState> {
fn balance_of(self: @TState, account: ContractAddress) -> u256;
fn owner_of(self: @TState, token_id: u256) -> ContractAddress;
fn transfer_from(ref self: TState, from: ContractAddress, to: ContractAddress, token_id: u256);
// fn safe_transfer_from(
// ref self: TState,
// from: ContractAddress,
// to: ContractAddress,
// token_id: u256,
// data: Span<felt252>
// );
fn approve(ref self: TState, to: ContractAddress, token_id: u256);
fn set_approval_for_all(ref self: TState, operator: ContractAddress, approved: bool);
fn get_approved(self: @TState, token_id: u256) -> ContractAddress;
Expand Down
Empty file added src/token/erc721/metadata.cairo
Empty file.
2 changes: 1 addition & 1 deletion target/dev/StarkBank_ERC20.casm.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion target/dev/StarkBank_ERC20.sierra.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion target/dev/StarkBank_ERC721.casm.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion target/dev/StarkBank_ERC721.sierra.json

Large diffs are not rendered by default.

57 changes: 41 additions & 16 deletions tests/token/test_erc721.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -59,35 +59,59 @@ fn OWNER() -> ContractAddress {
#[available_gas(20000000)]
fn test_constructor() {

let (owner, erc721) = setup_test_env();
'**** print constructor test ***'.print();

'print constructor test'.print();

let caller = contract_address_const::<'caller'>();
let (caller, erc721) = setup_test_env();
let reciever:ContractAddress = contract_address_const::<'reciever'>();


assert(erc721.name().unwrap() == NAME, 'Name should be NAME');
'pass 1'.print();
assert(erc721.symbol().unwrap() == SYMBOL, 'Symbol should be SYMBOL');
'pass 2'.print();
assert(erc721.balance_of(caller).unwrap() == 1, 'Balance should be one');
'pass 3'.print();
let token: u256 = 0x6F.into();
token.print();
assert(erc721.owner_of(token).unwrap() == caller, 'OWNER should be owner');

let token_id: u256 = 111;
token_id.print();
erc721.approve(reciever,token_id);
assert((erc721.get_approved(token_id)).unwrap() == reciever, 'reciever should be approved');
assert(erc721.owner_of(token_id).unwrap() == caller, 'OWNER should be caller');
}

#[test]
#[available_gas(20000000)]
fn test_owner(){
//owner is caller from setup
let (caller, erc721) = setup_test_env();
let token_id: u256 = 111;

assert(erc721.owner_of(token_id).unwrap() == caller, 'OWNER should be caller');
}

#[test]
#[available_gas(20000000)]
fn test_approve(){

let reciever = contract_address_const::<'reciever'>();
let (caller, erc721) = setup_test_env();

let token_id: u256 = 111;
token_id.print();
erc721.approve(reciever,token_id);
assert(erc721.get_approved(token_id).unwrap() == reciever, 'reciever should be approved');
}


fn setup_test_env() -> (ContractAddress, IERC721SafeDispatcher, ){

let caller = contract_address_const::<'caller'>();

let erc721_address: ContractAddress = deploy_erc721();
// Get an interface to interact with the ERC20 contract.
let erc721 = IERC721SafeDispatcher{contract_address: erc721_address};

// Prank the caller.
start_prank(erc721_address, OWNER());
start_prank(erc721_address, caller);

(OWNER(), erc721)
(caller, erc721)

}

Expand All @@ -102,10 +126,11 @@ fn deploy_erc721() -> ContractAddress{
constructor_calldata.append(NAME);
constructor_calldata.append(SYMBOL);
constructor_calldata.append(caller.into());
let token_felt252_low : felt252 = 0x6;
constructor_calldata.append(token_felt252_low);
let token_felt252_high : felt252 = 0xF;
constructor_calldata.append(token_felt252_high);
let token: u256 = 111;
constructor_calldata.append(token.low.into());
//(token.high).print();
//token.low.print();
constructor_calldata.append(token.high.into());

let prepared = PreparedContract { class_hash: class_hash, constructor_calldata: @constructor_calldata};

Expand Down

0 comments on commit 4ac426f

Please sign in to comment.