Skip to content

Commit

Permalink
Migrate ERC721 (#619)
Browse files Browse the repository at this point in the history
* continue account implementation

* add missing account interface functions

* tidy up module

* fix validate

* bump cairo + account changes

* fix __execute__, add serde, rename felt>felt252

* tidy up code

* WIP ERC721

* make format

* fix dispatcher call

* clean

* working on tests

* replace match with `is_some()` and `is_none()` for readeability

* erc721 tests

* use Option.expect

* add account tests

* check panic reason

* rename _owner() to _owner_of()

* spacing

* complete account implementation

* apply recommandation for PR

* Apply suggestions from code review

Co-authored-by: Andrew Fleming <fleming.andrew@protonmail.com>

* check low level ownership int

* prefix test function with test_

* Apply suggestions from code review

Co-authored-by: Andrew Fleming <fleming-andrew@protonmail.com>
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>

* apply review suggestions

* remove unused import

* clarify __execute__ guard

* add account tests

* add internals

* tidy up

* update ERC165 ids to u32

* apply sugestions from code review

* Apply suggestions from code review

Co-authored-by: Martín Triay <martriay@gmail.com>

* update & expand tests

* update lock

* add internal macro

* add internal macro

* add deregister

* update erc165

* wip (dispatched issue)

* fix abi

* start array→span transition

* minimise account dependency

* add SpanSerde in utils

* add dual interfaces

* update test message. fix linter

* split interfaces from preset module

* fix linter

* rename metadata id var

* add camelCase to traits

* fully implement dual interface traits

* simplify _owner_of

* add constructor and getter tests

* add token_uri tests

* remove conflictive test

* add erc721receiver. add IERC721ABI

* add safe_transfer_from tests

* add safe_mint tests

* Update src/openzeppelin/token/erc721/interface.cairo

Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* move erc721 abi next to module

* address review comments

---------

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Co-authored-by: Andrew Fleming <fleming.andrew@protonmail.com>
Co-authored-by: Andrew Fleming <fleming-andrew@protonmail.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
  • Loading branch information
5 people authored May 30, 2023
1 parent 372de37 commit d86eb73
Show file tree
Hide file tree
Showing 11 changed files with 1,414 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/openzeppelin/introspection/erc165.cairo
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const IERC165_ID: u32 = 0x01ffc9a7_u32;
const INVALID_ID: u32 = 0xffffffff_u32;

#[abi]
trait IERC165 {
fn supports_interface(interface_id: u32) -> bool;
}
Expand Down
3 changes: 2 additions & 1 deletion src/openzeppelin/tests.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ mod test_ownable;
mod test_erc165;
mod test_account;
mod test_erc20;
mod test_pausable;
mod test_erc721;
mod test_initializable;
mod test_pausable;
mod mocks;
mod utils;
1 change: 1 addition & 0 deletions src/openzeppelin/tests/mocks.cairo
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
mod reentrancy_attacker_mock;
mod reentrancy_mock;
mod erc721_receiver;
mod mock_pausable;
62 changes: 62 additions & 0 deletions src/openzeppelin/tests/mocks/erc721_receiver.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
const SUCCESS: felt252 = 123123;
const FAILURE: felt252 = 456456;

#[contract]
mod ERC721Receiver {
use openzeppelin::token::erc721::interface::IERC721Receiver;
use openzeppelin::token::erc721::interface::IERC721ReceiverCamel;
use openzeppelin::token::erc721::interface::IERC721_RECEIVER_ID;
use openzeppelin::introspection::erc165::ERC165;

use openzeppelin::utils::serde::SpanSerde;
use starknet::ContractAddress;
use array::SpanTrait;

impl ERC721ReceiverImpl of IERC721Receiver {
fn on_erc721_received(
operator: ContractAddress, from: ContractAddress, token_id: u256, data: Span<felt252>
) -> u32 {
if *data.at(0) == super::SUCCESS {
IERC721_RECEIVER_ID
} else {
0
}
}
}

impl ERC721ReceiverCamelImpl of IERC721ReceiverCamel {
fn onERC721Received(
operator: ContractAddress, from: ContractAddress, tokenId: u256, data: Span<felt252>
) -> u32 {
ERC721ReceiverImpl::on_erc721_received(operator, from, tokenId, data)
}
}

#[constructor]
fn constructor() {
ERC165::register_interface(IERC721_RECEIVER_ID);
}

#[view]
fn supports_interface(interface_id: u32) -> bool {
ERC165::supports_interface(interface_id)
}

#[external]
fn on_erc721_received(
operator: ContractAddress, from: ContractAddress, token_id: u256, data: Span<felt252>
) -> u32 {
ERC721ReceiverImpl::on_erc721_received(operator, from, token_id, data)
}

#[external]
fn onERC721Received(
operator: ContractAddress, from: ContractAddress, tokenId: u256, data: Span<felt252>
) -> u32 {
ERC721ReceiverCamelImpl::onERC721Received(operator, from, tokenId, data)
}
}


#[contract]
mod ERC721NonReceiver {}
Loading

0 comments on commit d86eb73

Please sign in to comment.