diff --git a/Web3Unity/Scripts/Library/ChainSafeRPC/ChainSafeRPC.cs b/Web3Unity/Scripts/Library/ChainSafeRPC/ChainSafeRPC.cs index 43e268aaf..47a503ff8 100644 --- a/Web3Unity/Scripts/Library/ChainSafeRPC/ChainSafeRPC.cs +++ b/Web3Unity/Scripts/Library/ChainSafeRPC/ChainSafeRPC.cs @@ -16,12 +16,13 @@ namespace Web3Unity.Scripts.Prefabs.Ethers public class ChainSafeRPC : MonoBehaviour { private Dictionary _chains; - static BaseProvider _provider; + private static BaseProvider _provider; private static string NFT_ADDRESS = "0xc81fa2eacc1c45688d481b11ce94c24a136e125d"; private string NFT_ABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"; + /// /// GetNetwork /// @@ -35,11 +36,8 @@ public static async Task GetNetwork() return network.Name; } - /// - /// SwitchNetwork - /// - /// - /* public async Task SwitchNetwork() + + /* public async Task SwitchNetwork() { // check type of provider to be Web3Provider if (_provider is not Web3Provider provider) @@ -102,6 +100,7 @@ public static async Task GetBalance(string _address) return balance.ToString(); } + /// /// /// @@ -113,6 +112,7 @@ public async Task GetCode(string _address) Debug.Log($"Contract code: {code}"); return code; } + /// /// /// @@ -125,6 +125,7 @@ public static async Task GetStorageAt(string _address, int position = 0) return slot0; } + /// /// /// @@ -142,6 +143,7 @@ public static async Task GetLastBlock() Debug.Log($"Last block gas used: {latestBlock.GasUsed}"); return latestBlock.BlockHash; } + /// /// GetBlockNumber /// @@ -152,6 +154,7 @@ public static async Task GetBlockNumber() var currentBlockNumber = await provider.GetBlockNumber(); return currentBlockNumber.ToString(); } + /// /// GetBlockByNumber /// @@ -163,6 +166,7 @@ public static async Task GetBlockByNumber() var blockByNumber = await provider.GetBlock(new BlockParameter(currentBlockNumber)); return blockByNumber.BlockHash; } + /// /// GetBlockWithTransactions /// @@ -175,6 +179,7 @@ public static async Task GetBlockWithTransactions() await _provider.GetBlockWithTransactions(new BlockParameter(currentBlockNumber.ToUlong() - 10)); return blockWithTx.Transactions[0].Hash; } + /// /// GetPreviousBlock /// @@ -233,6 +238,7 @@ await _provider.GetTransactionReceipt( Debug.Log($"Block hash from TX {latestBlockWithTx.Transactions[0].Hash} receipt: {receipt.BlockHash}"); return receipt.TransactionHash; } + /// /// CallContractMethod /// @@ -265,7 +271,7 @@ public static async Task Call(string abi, string address, string method) var provider = RPC.GetInstance.Provider(); var contract = new Contract(abi, address, provider); string[] obj = { }; - string args = JsonConvert.SerializeObject(obj); + var args = JsonConvert.SerializeObject(obj); // var name = await contract.Call(method); // Debug.Log($"NFT.name(): {name[0]}"); @@ -283,17 +289,20 @@ public static async Task Call(string abi, string address, string method) return contractData[0].ToString(); } + /// /// EstimateGasContractMethod /// /// - public async Task EstimateGasContractMethod(string abi, string address, string provider, string method, string args) + public async Task EstimateGasContractMethod(string abi, string address, string provider, string method, + string args) { var contract = new Contract(abi, address, _provider); var result = await contract.EstimateGas("ownerOf", new object[] { 1 }); Debug.Log($"NFT.onwerOf(1) gas: {result}"); return result.ToString(); } + /// /// GetAccounts /// @@ -315,6 +324,7 @@ public async Task GetAccounts() return true; } + /// /// GetSigner /// @@ -338,30 +348,26 @@ public async Task GetSigner() return true; } - /// - /// SignMessage - /// - /// - public async Task SignMessage() - { - // if (_provider is not JsonRpcProvider provider) - // { - // Debug.Log("Provider is not JsonRpcProvider"); - // return; - // } - // - // var signer = provider.GetSigner(); // default signer at index 0 - - // Debug.Log($"Signature string(hello): {await signer.SignMessage("hello")}"); - // Debug.Log($"Signature byte[](hello): {await signer.SignMessage(Encoding.ASCII.GetBytes("hello"))}"); - - // var sha3 = new Sha3Keccack(); - - // Debug.Log($"Legacy signature string(hello): {await signer._LegacySignMessage(sha3.CalculateHash(Encoding.ASCII.GetBytes("hello")))}"); - // Debug.Log($"Legacy signature byte[](hello): {await signer._LegacySignMessage(Encoding.ASCII.GetBytes("hello"))}"); - - return true; - } + //public async Task SignMessage() + //{ + // if (_provider is not JsonRpcProvider provider) + // { + // Debug.Log("Provider is not JsonRpcProvider"); + // return; + // } + // + // var signer = provider.GetSigner(); // default signer at index 0 + + // Debug.Log($"Signature string(hello): {await signer.SignMessage("hello")}"); + // Debug.Log($"Signature byte[](hello): {await signer.SignMessage(Encoding.ASCII.GetBytes("hello"))}"); + + // var sha3 = new Sha3Keccack(); + + // Debug.Log($"Legacy signature string(hello): {await signer._LegacySignMessage(sha3.CalculateHash(Encoding.ASCII.GetBytes("hello")))}"); + // Debug.Log($"Legacy signature byte[](hello): {await signer._LegacySignMessage(Encoding.ASCII.GetBytes("hello"))}"); + + // return true; + // } /// /// SendTransaction /// @@ -389,6 +395,7 @@ public async Task SendTransaction() return true; } + /// /// SendContract /// @@ -409,6 +416,7 @@ public async Task SendContract() return true; } + /// /// SendContractOverrideGas /// @@ -427,17 +435,18 @@ public async Task SendContractOverrideGas() var ret = await contract.Attach("0x000...000").Connect(signer).Send("mint", null, new TransactionRequest { GasLimit = new HexBigInteger("1000"), - GasPrice = new HexBigInteger("1000"), + GasPrice = new HexBigInteger("1000") }); Debug.Log($"NFT.mint(): {ret}"); return true; } + /// /// SubscribeToNewBlockEvent /// /// - public async Task SubscribeToNewBlockEvent() + public Task SubscribeToNewBlockEvent() { _provider.On("block", (ulong blockNumber) => { @@ -445,13 +454,14 @@ public async Task SubscribeToNewBlockEvent() return null; }); - return true; + return Task.FromResult(true); } + /// /// SubscribeToNewChainEvent /// /// - public async Task SubscribeToNewChainEvent() + public Task SubscribeToNewChainEvent() { _provider.On("chainChanged", (ulong chainId) => { @@ -459,12 +469,13 @@ public async Task SubscribeToNewChainEvent() return null; }); - return true; + return Task.FromResult(true); } + /// /// OnApplicationQuit /// - void OnApplicationQuit() + private void OnApplicationQuit() { Debug.Log("OnApplicationQuit"); _provider?.RemoveAllListeners();