feat: use base32 + status infura ipfs for ens contenthash
This commit is contained in:
parent
a9d9aeb0d3
commit
e8183f3a9f
|
@ -85,3 +85,9 @@
|
||||||
[submodule "vendor/nim-eth"]
|
[submodule "vendor/nim-eth"]
|
||||||
path = vendor/nim-eth
|
path = vendor/nim-eth
|
||||||
url = https://github.com/status-im/nim-eth
|
url = https://github.com/status-im/nim-eth
|
||||||
|
[submodule "vendor/nbaser"]
|
||||||
|
path = vendor/nbaser
|
||||||
|
url = https://github.com/D-Nice/nbaser/
|
||||||
|
[submodule "vendor/nim-base32"]
|
||||||
|
path = vendor/nim-base32
|
||||||
|
url = https://github.com/elktree/nim-base32
|
||||||
|
|
|
@ -5,14 +5,17 @@ import ../../status/libstatus/core
|
||||||
import ../../status/libstatus/settings as status_settings
|
import ../../status/libstatus/settings as status_settings
|
||||||
import json, json_serialization, sets, strutils
|
import json, json_serialization, sets, strutils
|
||||||
import chronicles
|
import chronicles
|
||||||
|
import nbaser
|
||||||
|
from base32 import nil
|
||||||
|
|
||||||
const AUTH_METHODS = toHashSet(["eth_accounts", "eth_coinbase", "eth_sendTransaction", "eth_sign", "keycard_signTypedData", "eth_signTypedData", "personal_sign", "personal_ecRecover"])
|
const AUTH_METHODS = toHashSet(["eth_accounts", "eth_coinbase", "eth_sendTransaction", "eth_sign", "keycard_signTypedData", "eth_signTypedData", "personal_sign", "personal_ecRecover"])
|
||||||
const SIGN_METHODS = toHashSet(["eth_sendTransaction", "personal_sign", "eth_signTypedData", "eth_signTypedData_v3"])
|
const SIGN_METHODS = toHashSet(["eth_sendTransaction", "personal_sign", "eth_signTypedData", "eth_signTypedData_v3"])
|
||||||
const ACC_METHODS = toHashSet(["eth_accounts", "eth_coinbase"])
|
const ACC_METHODS = toHashSet(["eth_accounts", "eth_coinbase"])
|
||||||
|
|
||||||
const IPFS_SCHEME = "https"
|
const IPFS_SCHEME = "https"
|
||||||
const IPFS_GATEWAY = "ipfs.status.im"
|
const IPFS_GATEWAY = ".infura.status.im"
|
||||||
const IPFS_PATH_PREFIX = "/ipfs/"
|
|
||||||
|
const base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
topics = "provider-view"
|
topics = "provider-view"
|
||||||
|
@ -165,15 +168,21 @@ QtObject:
|
||||||
QtProperty[int] networkId:
|
QtProperty[int] networkId:
|
||||||
read = getNetworkId
|
read = getNetworkId
|
||||||
|
|
||||||
|
proc toString(bytes: openarray[byte]): string =
|
||||||
|
result = newString(bytes.len)
|
||||||
|
copyMem(result[0].addr, bytes[0].unsafeAddr, bytes.len)
|
||||||
|
|
||||||
proc ensResourceURL*(self: Web3ProviderView, ens: string, url: string): string {.slot.} =
|
proc ensResourceURL*(self: Web3ProviderView, ens: string, url: string): string {.slot.} =
|
||||||
# TODO: add support for swarm: "swarm-gateways.net/bzz:/...." and ipns
|
# TODO: add support for swarm: "swarm-gateways.net/bzz:/...." and ipns
|
||||||
|
|
||||||
let contentHash = contenthash(ens)
|
let contentHash = contenthash(ens)
|
||||||
if contentHash == "0x": # ENS does not have a content hash
|
if contentHash == "": # ENS does not have a content hash
|
||||||
return url_replaceHostAndAddPath(url, IPFS_SCHEME, url_host(url), "")
|
return url_replaceHostAndAddPath(url, IPFS_SCHEME, url_host(url), "")
|
||||||
|
|
||||||
let path = IPFS_PATH_PREFIX & contentHash.decodeContentHash() & "/"
|
let decodedContentHash = contentHash.decodeContentHash()
|
||||||
result = url_replaceHostAndAddPath(url, IPFS_SCHEME, IPFS_GATEWAY, path)
|
let base32Hash = base32.encode(base58.decode(decodedContentHash).toString()).toLowerAscii().replace("=", "")
|
||||||
|
result = url_replaceHostAndAddPath(url, IPFS_SCHEME, base32Hash & IPFS_GATEWAY)
|
||||||
|
|
||||||
|
|
||||||
proc getHost*(self: Web3ProviderView, url: string): string {.slot.} =
|
proc getHost*(self: Web3ProviderView, url: string): string {.slot.} =
|
||||||
result = url_host(url)
|
result = url_host(url)
|
||||||
|
|
|
@ -141,7 +141,7 @@ proc contenthash*(ensAddr: string): string =
|
||||||
let response = callPrivateRPC("eth_call", payload)
|
let response = callPrivateRPC("eth_call", payload)
|
||||||
let bytesResponse = response.parseJson["result"].getStr;
|
let bytesResponse = response.parseJson["result"].getStr;
|
||||||
if bytesResponse == "0x":
|
if bytesResponse == "0x":
|
||||||
return "0x"
|
return ""
|
||||||
|
|
||||||
let size = fromHex(Stuint[256], bytesResponse[66..129]).toInt
|
let size = fromHex(Stuint[256], bytesResponse[66..129]).toInt
|
||||||
result = bytesResponse[130..129+size*2]
|
result = bytesResponse[130..129+size*2]
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 0c989e0d9580b4a6c14e11976dba3a0d503ecfcd
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 660680c1cbdf6b1294b669fdb8b6e9c89794cb5b
|
Loading…
Reference in New Issue