Нетериум, Гиперликвид. Ошибка Ошибка L1: Пользовательский или API-кошелек...(случайный хеш)... не существуетC#

Место общения программистов C#
Anonymous
Нетериум, Гиперликвид. Ошибка Ошибка L1: Пользовательский или API-кошелек...(случайный хеш)... не существует

Сообщение Anonymous »

Я пытаюсь подписать и отправить запрос заказа в Hyperliquid. И что бы я ни пробовал, а я пробовал много разного, получаю ответ:

Код: Выделить всё

L1 error: User or API Wallet 0xb37035fd36b3fc08b42969b806f6d01b9edce5ff does not exist.
Хеш всегда случайный. Я предполагаю, что он должен показывать мой адрес каждый раз, если код работает правильно.
Я смотрел SDK платформы Hyperliquid и пытался преобразовать их код из Python и TS в С#. Ничего не помогло, включая CGPT.

Код: Выделить всё

public static EthECDSASignature GetSignature(string privateKey, T action,
long nonce,
string? vaultAddress,
bool isMainNet = true)
{
var bytes = EncodeLOneAction(action, nonce, vaultAddress, isMainNet);
var signature = new EthECKey(privateKey).SignAndCalculateV(bytes);
return signature;
}

public static byte[] EncodeLOneAction(
T action,
long nonce,
string? vaultAddress,
bool isMainNet = true)
{
var actionHash = ActionHash(action, nonce, vaultAddress);
var domainSchema = GetDomainSchema1(actionHash, isMainNet);

var signer = new Eip712TypedDataSigner();
var encoder1 = signer.EncodeTypedData(domainSchema);

byte[] encodedDataHash1 = Sha3Keccack.Current.CalculateHash(encoder1);
return encodedDataHash1;
}

private static byte[] ActionHash(T action, long nonce, string? vaultAddress)
{
var data = MessagePackSerializer.Serialize(action);
var nonceBytes = BitConverter.GetBytes(nonce);

data = [.. data, .. nonceBytes];
if (string.IsNullOrEmpty(vaultAddress))
{
// Add end byte
data = [.. data, .. new byte[] { 0x00 }];
}
else
{
// Add new line byte before adding address
data = [.. data, .. new byte[] { 0x01 }, .. AddressToBytes(vaultAddress)];
}

return Sha3Keccack.Current.CalculateHash(data);
}

private static TypedData GetDomainSchema1(byte[] hash, bool isMainNet)
{
var typedData = new TypedData()
{
Domain = new Domain
{
ChainId = 1337,
Name = "Exchange",
VerifyingContract = "0x0000000000000000000000000000000000000000",
Version = "1"
},
PrimaryType = "Agent",
Types = MemberDescriptionFactory.GetTypesMemberDescription(typeof(Domain), typeof(AgentType))
};
typedData.SetMessage(new AgentType
{
Source = (isMainNet ? "a" : "b"),
ConnectionId = hash
});

return typedData;
}

[Struct("Agent")]
private class AgentType
{
[Parameter("string", "source", 1)]
public virtual string Source { get; set; } = null!;

[Parameter("bytes32", "connectionId", 2)]
public virtual byte[] ConnectionId { get; set; } = null!;
}
Мой сериализованный запрос на публикацию после всего этого перед отправкой в ​​Hyperliquid выглядит так

Код: Выделить всё

{
"method": "post",
"id": 0,
"request":
{
"type": "action",
"payload":
{
"action":
{
"type": "order",
"orders": [
{
"a": 1,
"b": true,
"p": "0.2",
"s": "1100",
"r": false,
"t":
{
"limit":
{
"tif": "Gtc"
}
}
}],
"grouping": "na"
},
"nonce": 1726578116356,
"signature":
{
"r": "***a6d70929151805870921825f219",
"s": "***d3090bb540e015a69226a35ae8d",
"v": 28
}
}
}
}
На данный момент я совершенно не понимаю, что может быть не так, и прошу помощи.

Подробнее здесь: https://stackoverflow.com/questions/789 ... dom-hash-d

Вернуться в «C#»