这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 49 additions & 38 deletions Web3Unity/Scripts/Library/ChainSafeRPC/ChainSafeRPC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ namespace Web3Unity.Scripts.Prefabs.Ethers
public class ChainSafeRPC : MonoBehaviour
{
private Dictionary<ulong, Chains.Chain> _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\"}]";

/// <summary>
/// GetNetwork
/// </summary>
Expand All @@ -35,11 +36,8 @@ public static async Task<string> GetNetwork()

return network.Name;
}
/// <summary>
/// SwitchNetwork
/// </summary>
/// <returns></returns>
/* public async Task<bool> SwitchNetwork()

/* public async Task<bool> SwitchNetwork()
{
// check type of provider to be Web3Provider
if (_provider is not Web3Provider provider)
Expand Down Expand Up @@ -102,6 +100,7 @@ public static async Task<string> GetBalance(string _address)

return balance.ToString();
}

/// <summary>
///
/// </summary>
Expand All @@ -113,6 +112,7 @@ public async Task<string> GetCode(string _address)
Debug.Log($"Contract code: {code}");
return code;
}

/// <summary>
///
/// </summary>
Expand All @@ -125,6 +125,7 @@ public static async Task<string> GetStorageAt(string _address, int position = 0)

return slot0;
}

/// <summary>
///
/// </summary>
Expand All @@ -142,6 +143,7 @@ public static async Task<string> GetLastBlock()
Debug.Log($"Last block gas used: {latestBlock.GasUsed}");
return latestBlock.BlockHash;
}

/// <summary>
/// GetBlockNumber
/// </summary>
Expand All @@ -152,6 +154,7 @@ public static async Task<string> GetBlockNumber()
var currentBlockNumber = await provider.GetBlockNumber();
return currentBlockNumber.ToString();
}

/// <summary>
/// GetBlockByNumber
/// </summary>
Expand All @@ -163,6 +166,7 @@ public static async Task<string> GetBlockByNumber()
var blockByNumber = await provider.GetBlock(new BlockParameter(currentBlockNumber));
return blockByNumber.BlockHash;
}

/// <summary>
/// GetBlockWithTransactions
/// </summary>
Expand All @@ -175,6 +179,7 @@ public static async Task<string> GetBlockWithTransactions()
await _provider.GetBlockWithTransactions(new BlockParameter(currentBlockNumber.ToUlong() - 10));
return blockWithTx.Transactions[0].Hash;
}

/// <summary>
/// GetPreviousBlock
/// </summary>
Expand Down Expand Up @@ -233,6 +238,7 @@ await _provider.GetTransactionReceipt(
Debug.Log($"Block hash from TX {latestBlockWithTx.Transactions[0].Hash} receipt: {receipt.BlockHash}");
return receipt.TransactionHash;
}

/// <summary>
/// CallContractMethod
/// </summary>
Expand Down Expand Up @@ -265,7 +271,7 @@ public static async Task<string> 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]}");

Expand All @@ -283,17 +289,20 @@ public static async Task<string> Call(string abi, string address, string method)

return contractData[0].ToString();
}

/// <summary>
/// EstimateGasContractMethod
/// </summary>
/// <returns></returns>
public async Task<string> EstimateGasContractMethod(string abi, string address, string provider, string method, string args)
public async Task<string> 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();
}

/// <summary>
/// GetAccounts
/// </summary>
Expand All @@ -315,6 +324,7 @@ public async Task<bool> GetAccounts()

return true;
}

/// <summary>
/// GetSigner
/// </summary>
Expand All @@ -338,30 +348,26 @@ public async Task<bool> GetSigner()

return true;
}
/// <summary>
/// SignMessage
/// </summary>
/// <returns></returns>
public async Task<bool> 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<bool> 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;
// }
/// <summary>
/// SendTransaction
/// </summary>
Expand Down Expand Up @@ -389,6 +395,7 @@ public async Task<bool> SendTransaction()

return true;
}

/// <summary>
/// SendContract
/// </summary>
Expand All @@ -409,6 +416,7 @@ public async Task<bool> SendContract()

return true;
}

/// <summary>
/// SendContractOverrideGas
/// </summary>
Expand All @@ -427,44 +435,47 @@ public async Task<bool> 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;
}

/// <summary>
/// SubscribeToNewBlockEvent
/// </summary>
/// <returns></returns>
public async Task<bool> SubscribeToNewBlockEvent()
public Task<bool> SubscribeToNewBlockEvent()
{
_provider.On("block", (ulong blockNumber) =>
{
Debug.Log($"New block {blockNumber}");
return null;
});

return true;
return Task.FromResult(true);
}

/// <summary>
/// SubscribeToNewChainEvent
/// </summary>
/// <returns></returns>
public async Task<bool> SubscribeToNewChainEvent()
public Task<bool> SubscribeToNewChainEvent()
{
_provider.On("chainChanged", (ulong chainId) =>
{
Debug.Log($"Chain changed {chainId}");
return null;
});

return true;
return Task.FromResult(true);
}

/// <summary>
/// OnApplicationQuit
/// </summary>
void OnApplicationQuit()
private void OnApplicationQuit()
{
Debug.Log("OnApplicationQuit");
_provider?.RemoveAllListeners();
Expand Down