-
Notifications
You must be signed in to change notification settings - Fork 49
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Gateway testnet #207
Gateway testnet #207
Changes from 9 commits
55c7031
012c5e6
72ff65b
2715a72
b4f8749
e360b47
95914a5
ee7ad2f
7d73ae0
0f5ad41
ca90755
6751cc2
1ed0d9e
4d7f25c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ | |
"test": "echo \"Error: no test specified\" && exit 1", | ||
"lint:fix": "npx eslint . --ext .js,.ts --fix", | ||
"lint": "npx eslint . --ext .js,.ts", | ||
"deploy": "npx hardhat compile --force && npx hardhat deploy --network localhost && npx hardhat deploy --name Echo --network localhost --gateway 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" | ||
"deploy:localnet": "npx hardhat compile --force && npx hardhat deploy --network localhost --gateway 0x9A676e781A523b5d0C0e43731313A708CB607508 && npx hardhat deploy --name Echo --network localhost --gateway 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π οΈ Refactor suggestion Add deployment scripts for testnets mentioned in PR objectives. The current script only handles localhost deployment. Consider adding separate scripts for Base Sepolia, Polygon Amoy, and ZetaChain testnet deployments to align with the PR objectives. "scripts": {
"deploy:localnet": "npx hardhat compile --force && npx hardhat deploy --network localhost --gateway 0x9A676e781A523b5d0C0e43731313A708CB607508 && npx hardhat deploy --name Echo --network localhost --gateway 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0",
+ "deploy:base-sepolia": "npx hardhat compile --force && npx hardhat deploy --network base-sepolia",
+ "deploy:polygon-amoy": "npx hardhat compile --force && npx hardhat deploy --network polygon-amoy",
+ "deploy:zeta-testnet": "npx hardhat compile --force && npx hardhat deploy --network zeta-testnet"
}
|
||
}, | ||
"keywords": [], | ||
"author": "", | ||
|
@@ -57,6 +57,6 @@ | |
"@solana-developers/helpers": "^2.4.0", | ||
"@solana/spl-memo": "^0.2.5", | ||
"@solana/web3.js": "^1.95.2", | ||
"@zetachain/protocol-contracts": "10.0.0-rc10" | ||
"@zetachain/protocol-contracts": "10.0.0-rc11" | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,6 +31,6 @@ task("deploy", "Deploy the contract", main) | |
.addOptionalParam("name", "Contract to deploy", "Hello") | ||
.addOptionalParam( | ||
"gateway", | ||
"Gateway address (default: ZetaChain Gateway)", | ||
"0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0" | ||
"Gateway address (default: ZetaChain Gateway on testnet)", | ||
"0x6c533f7fe93fae114d0954697069df33c9b74fd7" | ||
Comment on lines
+34
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π οΈ Refactor suggestion Consider using environment-specific gateway addresses While the updated gateway address is correct for the testnet, hardcoding it directly in the task definition might cause issues when deploying to different environments. Consider implementing a more flexible configuration approach. Here's a suggested implementation using network-specific configuration: + const GATEWAY_ADDRESSES = {
+ baseSepolia: "0x6c533f7fe93fae114d0954697069df33c9b74fd7",
+ polygonAmoy: "0x...", // Add Polygon Amoy gateway address
+ zetaChainTestnet: "0x...", // Add ZetaChain testnet gateway address
+ };
task("deploy", "Deploy the contract", main)
.addFlag("json", "Output in JSON")
.addOptionalParam("name", "Contract to deploy", "Hello")
.addOptionalParam(
"gateway",
- "Gateway address (default: ZetaChain Gateway on testnet)",
- "0x6c533f7fe93fae114d0954697069df33c9b74fd7"
+ "Gateway address (defaults to network-specific gateway address)",
+ undefined,
types.string
); Then update the main function to use network-specific addresses: const main = async (args: any, hre: HardhatRuntimeEnvironment) => {
const network = hre.network.name;
const gatewayAddress = args.gateway || GATEWAY_ADDRESSES[network];
if (!gatewayAddress) {
throw new Error(`No gateway address configured for network: ${network}`);
}
// ... rest of the deployment logic
const contract = await (factory as any).deploy(gatewayAddress); π‘ Codebase verification Different gateway addresses detected across examples The hello and NFT examples are using different gateway addresses:
This inconsistency in gateway addresses between examples should be addressed to prevent confusion. Consider:
π Analysis chainVerify gateway address usage across networks Let's verify how this gateway address is being used across different networks to ensure consistency. Let me check the gateway address configuration in the NFT example to get a complete picture. π Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for gateway address usage across the codebase
echo "Searching for gateway address references..."
rg -i "0x6c533f7fe93fae114d0954697069df33c9b74fd7"
echo "\nSearching for potential gateway configurations..."
rg -l "gateway.*address" --type ts
Length of output: 406 Script: #!/bin/bash
# Check the gateway address configuration in the NFT example
echo "Content of examples/nft/tasks/deploy.ts:"
cat examples/nft/tasks/deploy.ts
Length of output: 1498 |
||
); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2433,6 +2433,16 @@ | |
"@openzeppelin/contracts-upgradeable" "^5.0.2" | ||
ethers "^6.13.1" | ||
|
||
"@zetachain/[email protected]": | ||
version "10.0.0-rc11" | ||
resolved "https://registry.yarnpkg.com/@zetachain/protocol-contracts/-/protocol-contracts-10.0.0-rc11.tgz#53f55ead492f7b5802b1feae4e51abc75730af33" | ||
integrity sha512-qWazjqnIGRngf4OmyeSIv7sHICQRdMQ1CKPIQIqxA8qFR+gHhDHSfvMdRAvgWbsfkimXOIFiHVIATypyWhviJw== | ||
dependencies: | ||
"@openzeppelin/contracts" "^5.0.2" | ||
"@openzeppelin/contracts-upgradeable" "^5.0.2" | ||
"@zetachain/networks" "^10.0.0" | ||
ethers "^6.13.1" | ||
|
||
"@zetachain/[email protected]": | ||
version "9.0.0" | ||
resolved "https://registry.yarnpkg.com/@zetachain/protocol-contracts/-/protocol-contracts-9.0.0.tgz#c20ad5da43f6f3676f31556b303d1cb4ea17357e" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
.yarn | ||
artifacts | ||
cache | ||
coverage | ||
node_modules | ||
typechain-types |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,47 @@ | ||||||||||||||||||||||||||||||||||||||||||||
const path = require("path"); | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||
* @type {import("eslint").Linter.Config} | ||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||
module.exports = { | ||||||||||||||||||||||||||||||||||||||||||||
env: { | ||||||||||||||||||||||||||||||||||||||||||||
browser: false, | ||||||||||||||||||||||||||||||||||||||||||||
es2021: true, | ||||||||||||||||||||||||||||||||||||||||||||
mocha: true, | ||||||||||||||||||||||||||||||||||||||||||||
node: true, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
extends: ["plugin:prettier/recommended"], | ||||||||||||||||||||||||||||||||||||||||||||
parser: "@typescript-eslint/parser", | ||||||||||||||||||||||||||||||||||||||||||||
parserOptions: { | ||||||||||||||||||||||||||||||||||||||||||||
ecmaVersion: 12, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
plugins: [ | ||||||||||||||||||||||||||||||||||||||||||||
"@typescript-eslint", | ||||||||||||||||||||||||||||||||||||||||||||
"prettier", | ||||||||||||||||||||||||||||||||||||||||||||
"simple-import-sort", | ||||||||||||||||||||||||||||||||||||||||||||
"sort-keys-fix", | ||||||||||||||||||||||||||||||||||||||||||||
"typescript-sort-keys", | ||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+18
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π οΈ Refactor suggestion Consider adding error prevention plugins While the current plugins focus on code organization and formatting, consider adding plugins for error prevention: plugins: [
"@typescript-eslint",
"prettier",
"simple-import-sort",
"sort-keys-fix",
"typescript-sort-keys",
+ "eslint-plugin-import",
+ "eslint-plugin-promise",
+ "eslint-plugin-security"
], π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
rules: { | ||||||||||||||||||||||||||||||||||||||||||||
"@typescript-eslint/sort-type-union-intersection-members": "error", | ||||||||||||||||||||||||||||||||||||||||||||
camelcase: "off", | ||||||||||||||||||||||||||||||||||||||||||||
"simple-import-sort/exports": "error", | ||||||||||||||||||||||||||||||||||||||||||||
"simple-import-sort/imports": "error", | ||||||||||||||||||||||||||||||||||||||||||||
"sort-keys-fix/sort-keys-fix": "error", | ||||||||||||||||||||||||||||||||||||||||||||
"typescript-sort-keys/interface": "error", | ||||||||||||||||||||||||||||||||||||||||||||
"typescript-sort-keys/string-enum": "error", | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+25
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π οΈ Refactor suggestion Consider strengthening TypeScript-specific rules The current rules focus on sorting and formatting. Consider adding stricter TypeScript-specific rules for better type safety. rules: {
"@typescript-eslint/sort-type-union-intersection-members": "error",
+ "@typescript-eslint/explicit-function-return-type": "error",
+ "@typescript-eslint/no-explicit-any": "error",
+ "@typescript-eslint/strict-boolean-expressions": "error",
camelcase: "off",
"simple-import-sort/exports": "error",
"simple-import-sort/imports": "error",
"sort-keys-fix/sort-keys-fix": "error",
"typescript-sort-keys/interface": "error",
"typescript-sort-keys/string-enum": "error",
}, π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
settings: { | ||||||||||||||||||||||||||||||||||||||||||||
"import/parsers": { | ||||||||||||||||||||||||||||||||||||||||||||
"@typescript-eslint/parser": [".js", ".jsx", ".ts", ".tsx", ".d.ts"], | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
"import/resolver": { | ||||||||||||||||||||||||||||||||||||||||||||
node: { | ||||||||||||||||||||||||||||||||||||||||||||
extensions: [".js", ".jsx", ".ts", ".tsx", ".d.ts"], | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
typescript: { | ||||||||||||||||||||||||||||||||||||||||||||
project: path.join(__dirname, "tsconfig.json"), | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
node_modules | ||
.env | ||
coverage | ||
coverage.json | ||
typechain | ||
typechain-types | ||
dependencies | ||
|
||
# Hardhat files | ||
cache | ||
artifacts | ||
|
||
# Foundry files | ||
out | ||
cache_forge | ||
|
||
access_token |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
MIT License | ||
|
||
Copyright (c) 2023 ZetaChain | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# NFT Example | ||
|
||
This example currently only works with localnet `v4.0.0-rc*`, which supports | ||
authenticated calls and multiple EVM chains. |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,136 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SPDX-License-Identifier: MIT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pragma solidity 0.8.26; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@openzeppelin/contracts/access/Ownable.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π οΈ Refactor suggestion Remove unused import of The import statement for Apply this diff to remove the unused import: - import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import "@zetachain/protocol-contracts/contracts/evm/GatewayEVM.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {RevertContext} from "@zetachain/protocol-contracts/contracts/Revert.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
contract Connected is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GatewayEVM public immutable gateway; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 private _nextTokenId; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address public counterparty; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function setCounterparty(address contractAddress) external onlyOwner { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
counterparty = contractAddress; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
constructor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address payable gatewayAddress, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address initialOwner | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) ERC721("MyToken", "MTK") Ownable(initialOwner) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway = GatewayEVM(gatewayAddress); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function safeMint(address to, string memory uri) public onlyOwner { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 hash = uint256( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
keccak256( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
abi.encodePacked(address(this), block.number, _nextTokenId++) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 tokenId = hash & 0x00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_safeMint(to, tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_setTokenURI(tokenId, uri); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+28
to
+39
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Review the token ID generation method for potential collisions The Suggestion:
Apply this diff to use function safeMint(address to, string memory uri) public onlyOwner {
- uint256 hash = uint256(
- keccak256(
- abi.encodePacked(address(this), block.number, _nextTokenId++)
- )
- );
-
- uint256 tokenId = hash & 0x00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
+ uint256 tokenId = _nextTokenId++;
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
} π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function transferCrossChain( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 tokenId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address receiver, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address destination | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) external payable { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
string memory uri = tokenURI(tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_burn(tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes memory encodedData = abi.encode( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tokenId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msg.sender, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uri, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
destination | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RevertOptions memory revertOptions = RevertOptions( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address(this), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address(0), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
encodedData, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (destination == address(0)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway.call(receiver, encodedData, revertOptions); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway.depositAndCall{value: msg.value}( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
receiver, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
encodedData, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
revertOptions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add ownership check to prevent unauthorized token transfers The Apply this diff to include an ownership check: function transferCrossChain(
uint256 tokenId,
address receiver,
address destination
) external payable {
+ require(ownerOf(tokenId) == msg.sender, "Caller is not the token owner");
string memory uri = tokenURI(tokenId);
_burn(tokenId);
// ...
}
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function onCall( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MessageContext calldata messageContext, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes calldata message | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) external payable returns (bytes4) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (messageContext.sender != counterparty) revert("Unauthorized"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(uint256 tokenId, address sender, string memory uri) = abi.decode( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(uint256, address, string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_safeMint(sender, tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_setTokenURI(tokenId, uri); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ""; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Restrict The Apply this diff to ensure only the function onCall(
MessageContext calldata messageContext,
bytes calldata message
) external payable returns (bytes4) {
+ require(msg.sender == address(gateway), "Caller is not the gateway");
if (messageContext.sender != counterparty) revert("Unauthorized");
// ...
} π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function onRevert(RevertContext calldata context) external { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(uint256 tokenId, address sender, string memory uri) = abi.decode( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
context.revertMessage, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(uint256, address, string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_safeMint(sender, tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_setTokenURI(tokenId, uri); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+89
to
+97
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Restrict Similar to Apply this diff to enforce that only the function onRevert(RevertContext calldata context) external {
+ require(msg.sender == address(gateway), "Caller is not the gateway");
// ...
} π Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
receive() external payable {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fallback() external payable {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The following functions are overrides required by Solidity. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function _update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address to, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 tokenId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address auth | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) internal override(ERC721, ERC721Enumerable) returns (address) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return super._update(to, tokenId, auth); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function _increaseBalance( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address account, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint128 value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) internal override(ERC721, ERC721Enumerable) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
super._increaseBalance(account, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function tokenURI( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 tokenId | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) public view override(ERC721, ERC721URIStorage) returns (string memory) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return super.tokenURI(tokenId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function supportsInterface( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes4 interfaceId | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
view | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
override(ERC721, ERC721Enumerable, ERC721URIStorage) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
returns (bool) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return super.supportsInterface(interfaceId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π‘ Codebase verification
API Evolution Requires Attention: Legacy Contracts Found
The verification reveals that legacy contracts in the
omnichain/swap/
directory still use the oldonCrossChainCall
function withzContext
parameter type. Specifically:omnichain/swap/contracts/Swap.sol
omnichain/swap/contracts/SwapToAnyToken.sol
This indicates a breaking change in the contract interface from
zContract
toUniversalContract
, where newer examples use the updatedonCall
withMessageContext
. To maintain protocol consistency:omnichain/swap/
to use the new interfaceonCrossChainCall
zContract
interface in favor ofUniversalContract
π Analysis chain
Verify migration steps for onCall function signature change.
The function signature change from
onCrossChainCall
toonCall
withMessageContext
parameter type might impact existing deployments. Ensure that:π Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 119
Script:
Length of output: 4767