Skip to content

Commit

Permalink
Merge branch 'main' into ibc_cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
dssei authored Jan 24, 2025
2 parents 41ed536 + acf122d commit adbdfa6
Show file tree
Hide file tree
Showing 25 changed files with 192 additions and 46 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/forge-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
- name: Run Forge build
run: |
forge --version
forge build --sizes --evm-version=cancun
forge build --evm-version=cancun
id: build

- name: Run Forge tests
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
NUM_SPLIT=20
make test-group-${{matrix.part}} NUM_SPLIT=20
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: "${{ github.sha }}-${{ matrix.part }}-coverage"
path: ./${{ matrix.part }}.profile.out
Expand All @@ -59,7 +59,7 @@ jobs:

# Download all coverage reports from the 'tests' job
- name: Download coverage reports
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4

- name: Set GOPATH
run: echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV
Expand Down
3 changes: 2 additions & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ func New(
)

// Create Transfer Keepers
app.TransferKeeper = ibctransferkeeper.NewKeeper(
app.TransferKeeper = ibctransferkeeper.NewKeeperWithAddressHandler(
appCodec,
keys[ibctransfertypes.StoreKey],
app.GetSubspace(ibctransfertypes.ModuleName),
Expand All @@ -504,6 +504,7 @@ func New(
app.AccountKeeper,
app.BankKeeper,
scopedTransferKeeper,
evmkeeper.NewEvmAddressHandler(&app.EvmKeeper),
)
transferModule := transfer.NewAppModule(app.TransferKeeper)
transferIBCModule := transfer.NewIBCModule(app.TransferKeeper)
Expand Down
11 changes: 9 additions & 2 deletions contracts/src/CW1155ERC1155Pointer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,13 @@ contract CW1155ERC1155Pointer is ERC1155, ERC2981 {
}

// Queries
function owner() public view returns (address) {
string memory req = _curlyBrace(_formatPayload("ownership", "{}"));
bytes memory response = WasmdPrecompile.query(Cw1155Address, bytes(req));
bytes memory owner_bytes = JsonPrecompile.extractAsBytes(response, "owner");
return AddrPrecompile.getEvmAddr(string(owner_bytes));
}

function balanceOf(address account, uint256 id) public view override returns (uint256) {
require(account != address(0), "ERC1155: cannot query balance of zero address");
string memory own = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(account)));
Expand Down Expand Up @@ -238,8 +245,8 @@ contract CW1155ERC1155Pointer is ERC1155, ERC2981 {
return string(JsonPrecompile.extractAsBytes(response, "token_uri"));
}

function isApprovedForAll(address owner, address operator) public view override returns (bool) {
string memory own = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner)));
function isApprovedForAll(address owner_, address operator) public view override returns (bool) {
string memory own = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner_)));
string memory op = _formatPayload("operator", _doubleQuotes(AddrPrecompile.getSeiAddr(operator)));
string memory req = _curlyBrace(_formatPayload("is_approved_for_all", _curlyBrace(_join(own, ",", op))));
bytes32 response = keccak256(WasmdPrecompile.query(Cw1155Address, bytes(req)));
Expand Down
22 changes: 15 additions & 7 deletions contracts/src/CW721ERC721Pointer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,22 @@ contract CW721ERC721Pointer is ERC721,ERC2981 {
}

// Queries
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) {
// owner of the entire collection, not specific to a token id
function owner() public view returns (address) {
string memory req = _curlyBrace(_formatPayload("ownership", "{}"));
bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req));
bytes memory owner_bytes = JsonPrecompile.extractAsBytes(response, "owner");
return AddrPrecompile.getEvmAddr(string(owner_bytes));
}

function balanceOf(address owner_) public view override returns (uint256) {
if (owner_ == address(0)) {
revert ERC721InvalidOwner(address(0));
}
uint256 numTokens = 0;
string memory startAfter;
string memory qb = string.concat(
string.concat("\"limit\":1000,\"owner\":\"", AddrPrecompile.getSeiAddr(owner)),
string.concat("\"limit\":1000,\"owner\":\"", AddrPrecompile.getSeiAddr(owner_)),
"\""
);
bytes32 terminator = keccak256("{\"tokens\":[]}");
Expand All @@ -74,8 +82,8 @@ contract CW721ERC721Pointer is ERC721,ERC2981 {
string memory tId = _formatPayload("token_id", _doubleQuotes(Strings.toString(tokenId)));
string memory req = _curlyBrace(_formatPayload("owner_of", _curlyBrace(tId)));
bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req));
bytes memory owner = JsonPrecompile.extractAsBytes(response, "owner");
return AddrPrecompile.getEvmAddr(string(owner));
bytes memory owner_ = JsonPrecompile.extractAsBytes(response, "owner");
return AddrPrecompile.getEvmAddr(string(owner_));
}

function getApproved(uint256 tokenId) public view override returns (address) {
Expand All @@ -90,8 +98,8 @@ contract CW721ERC721Pointer is ERC721,ERC2981 {
return address(0);
}

function isApprovedForAll(address owner, address operator) public view override returns (bool) {
string memory o = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner)));
function isApprovedForAll(address owner_, address operator) public view override returns (bool) {
string memory o = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner_)));
string memory req = _curlyBrace(_formatPayload("all_operators", _curlyBrace(o)));
bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req));
bytes[] memory approvals = JsonPrecompile.extractAsBytesList(response, "operators");
Expand Down
9 changes: 9 additions & 0 deletions contracts/test/CW1155ERC1155PointerTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,15 @@ contract CW1155ERC1155PointerTest is Test {
pointer.balanceOf(MockZeroAddress, 1);
}

function testOwner() public {
vm.mockCall(
WASMD_PRECOMPILE_ADDRESS,
abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"ownership\":{}}")),
abi.encode("{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\"}")
);
assertEq(pointer.owner(), MockOperatorEVMAddr);
}

function testBalanceOfBatch() public {
vm.mockCall(
ADDR_PRECOMPILE_ADDRESS,
Expand Down
5 changes: 5 additions & 0 deletions contracts/test/ERC1155toCW1155PointerTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ describe("ERC1155 to CW1155 Pointer", function () {
})

describe("read", function(){
it("owner of collection", async function () {
const owner = await pointerAcc0.owner();
expect(owner).to.equal(admin.evmAddress);
});

it("get name", async function () {
const name = await pointerAcc0.name();
expect(name).to.equal("Test");
Expand Down
5 changes: 5 additions & 0 deletions contracts/test/ERC721toCW721PointerTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ describe("ERC721 to CW721 Pointer", function () {
expect(symbol).to.equal("TEST");
});

it("owner of collection", async function () {
const owner = await pointerAcc0.owner();
expect(owner).to.equal(admin.evmAddress);
});

it("owner of", async function () {
const owner = await pointerAcc0.ownerOf(1);
expect(owner).to.equal(admin.evmAddress);
Expand Down
2 changes: 2 additions & 0 deletions contracts/test/lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const ABI = {
"event ApprovalForAll(address indexed owner, address indexed operator, bool approved)",
"function name() view returns (string)",
"function symbol() view returns (string)",
"function owner() view returns (address)",
"function totalSupply() view returns (uint256)",
"function tokenURI(uint256 tokenId) view returns (string)",
"function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address, uint256)",
Expand All @@ -42,6 +43,7 @@ const ABI = {
"event URI(string _value, uint256 indexed _id)",
"function name() view returns (string)",
"function symbol() view returns (string)",
"function owner() view returns (address)",
"function uri(uint256 _id) view returns (string)",
"function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address, uint256)",
"function balanceOf(address _owner, uint256 _id) view returns (uint256)",
Expand Down
15 changes: 14 additions & 1 deletion evmrpc/subscribe.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,20 @@ func (a *SubscriptionAPI) Logs(ctx context.Context, filter *filters.FilterCriter
if filter == nil {
filter = &filters.FilterCriteria{}
}
// when fromBlock is 0 and toBlock is latest, adjust the filter
// to unbounded filter
if filter.FromBlock != nil && filter.FromBlock.Int64() == 0 &&
filter.ToBlock != nil && filter.ToBlock.Int64() < 0 {
latest := big.NewInt(a.logFetcher.ctxProvider(LatestCtxHeight).BlockHeight())
unboundedFilter := &filters.FilterCriteria{
FromBlock: latest, // set to latest block height
ToBlock: nil, // set to nil to continue listening
Addresses: filter.Addresses,
Topics: filter.Topics,
}
filter = unboundedFilter
}

rpcSub := notifier.CreateSubscription()

if filter.BlockHash != nil {
Expand Down Expand Up @@ -183,7 +197,6 @@ func (a *SubscriptionAPI) Logs(ctx context.Context, filter *filters.FilterCriter
}
begin = lastToHeight
filter.FromBlock = big.NewInt(lastToHeight + 1)

time.Sleep(SleepInterval)
}
}()
Expand Down
11 changes: 5 additions & 6 deletions evmrpc/subscribe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,16 @@ func TestSubscribeEmptyLogs(t *testing.T) {
}

func TestSubscribeNewLogs(t *testing.T) {
t.Parallel()
data := map[string]interface{}{
"fromBlock": "0x0",
"toBlock": "latest",
"address": []common.Address{
common.HexToAddress("0x1111111111111111111111111111111111111112"),
common.HexToAddress("0xc0ffee254729296a45a3885639AC7E10F9d54979"),
common.HexToAddress("0x1111111111111111111111111111111111111111"),
},
"topics": [][]common.Hash{
{
common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000123"),
common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111"),
common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111112"),
},
},
}
Expand Down Expand Up @@ -148,11 +147,11 @@ func TestSubscribeNewLogs(t *testing.T) {
t.Fatal("Subscription ID does not match")
}
resultMap := paramMap["result"].(map[string]interface{})
if resultMap["address"] != "0x1111111111111111111111111111111111111112" && resultMap["address"] != "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" {
if resultMap["address"] != "0x1111111111111111111111111111111111111111" && resultMap["address"] != "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" {
t.Fatalf("Unexpected address, got %v", resultMap["address"])
}
firstTopic := resultMap["topics"].([]interface{})[0].(string)
if firstTopic != "0x0000000000000000000000000000000000000000000000000000000000000123" {
if firstTopic != "0x1111111111111111111111111111111111111111111111111111111111111111" {
t.Fatalf("Unexpected topic, got %v", firstTopic)
}
case <-timer.C:
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ replace (
github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0
github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.51
github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.2.0
github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.4
github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.5
github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-9.0.20241224143343-21ee50facc96
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.46
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1354,8 +1354,8 @@ github.com/sei-protocol/sei-db v0.0.46 h1:naXfSp1I3UgJJm/iSvXpdFzr9nofEOxp/EekcA
github.com/sei-protocol/sei-db v0.0.46/go.mod h1:m5g7p0QeAS3dNJHIl28zQpzOgxQmvYqPb7t4hwgIOCA=
github.com/sei-protocol/sei-iavl v0.2.0 h1:OisPjXiDT+oe+aeckzDEFgkZCYuUjHgs/PP8DPicN+I=
github.com/sei-protocol/sei-iavl v0.2.0/go.mod h1:qRf8QYUPfrAO7K6VDB2B2l/N7K5L76OorioGBcJBIbw=
github.com/sei-protocol/sei-ibc-go/v3 v3.3.4 h1:M1r1B2yzogs7RyXdCPgaNJlxqSC/rU2goqtfnUTXS/M=
github.com/sei-protocol/sei-ibc-go/v3 v3.3.4/go.mod h1:VwB/vWu4ysT5DN2aF78d17LYmx3omSAdq6gpKvM7XRA=
github.com/sei-protocol/sei-ibc-go/v3 v3.3.5 h1:SQRzWi9KSMuGNGd3f5RWAmsGGk7yeY1zhnEnrr/nqug=
github.com/sei-protocol/sei-ibc-go/v3 v3.3.5/go.mod h1:VwB/vWu4ysT5DN2aF78d17LYmx3omSAdq6gpKvM7XRA=
github.com/sei-protocol/sei-tendermint v0.4.6 h1:Gmw4tjLSnghAdue54HJzDySDvxs2Hd5d0rrv3ajgRSA=
github.com/sei-protocol/sei-tendermint v0.4.6/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4=
github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY=
Expand Down
13 changes: 2 additions & 11 deletions precompiles/ibc/ibc.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"math/big"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/bech32"
"github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"
clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"
connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"
Expand Down Expand Up @@ -356,16 +355,8 @@ func (p PrecompileExecutor) validateCommonArgs(ctx sdk.Context, args []interface
}

receiverAddressString, ok := args[0].(string)
if !ok {
return nil, errors.New("receiverAddress is not a string")
}
_, bz, err := bech32.DecodeAndConvert(receiverAddressString)
if err != nil {
return nil, err
}
err = sdk.VerifyAddressFormat(bz)
if err != nil {
return nil, err
if !ok || receiverAddressString == "" {
return nil, errors.New("receiverAddress is not a string or empty")
}

port, ok := args[1].(string)
Expand Down
8 changes: 4 additions & 4 deletions precompiles/ibc/ibc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ func TestPrecompile_Run(t *testing.T) {
caller: senderEvmAddress,
callingContract: senderEvmAddress,
input: &input{
receiverAddr: "invalid",
receiverAddr: "",
sourcePort: "transfer",
sourceChannel: "channel-0",
denom: "",
Expand All @@ -224,7 +224,7 @@ func TestPrecompile_Run(t *testing.T) {
},
wantBz: nil,
wantErr: true,
wantErrMsg: "decoding bech32 failed: invalid bech32 string length 7",
wantErrMsg: "receiverAddress is not a string or empty",
},
{
name: "memo is added to the transfer if passed",
Expand Down Expand Up @@ -440,7 +440,7 @@ func TestTransferWithDefaultTimeoutPrecompile_Run(t *testing.T) {
caller: senderEvmAddress,
callingContract: senderEvmAddress,
input: &input{
receiverAddr: "invalid",
receiverAddr: "",
sourcePort: "transfer",
sourceChannel: "channel-0",
denom: "",
Expand All @@ -451,7 +451,7 @@ func TestTransferWithDefaultTimeoutPrecompile_Run(t *testing.T) {
},
wantBz: nil,
wantErr: true,
wantErrMsg: "decoding bech32 failed: invalid bech32 string length 7",
wantErrMsg: "receiverAddress is not a string or empty",
},
}
for _, tt := range tests {
Expand Down
Loading

0 comments on commit adbdfa6

Please sign in to comment.