signer/core: fix complex typed data sign (EIP712) (#24220)
Co-authored-by: specerxi <xhxpecer@gmail.com>
This commit is contained in:
parent
2d20fed893
commit
5a0d487c3b
@ -262,6 +262,7 @@ func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage
|
||||
|
||||
// Dependencies returns an array of custom types ordered by their hierarchical reference tree
|
||||
func (typedData *TypedData) Dependencies(primaryType string, found []string) []string {
|
||||
primaryType = strings.TrimSuffix(primaryType, "[]")
|
||||
includes := func(arr []string, str string) bool {
|
||||
for _, obj := range arr {
|
||||
if obj == str {
|
||||
@ -364,7 +365,7 @@ func (typedData *TypedData) EncodeData(primaryType string, data map[string]inter
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
arrayBuffer.Write(encodedData)
|
||||
arrayBuffer.Write(crypto.Keccak256(encodedData))
|
||||
} else {
|
||||
bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth)
|
||||
if err != nil {
|
||||
|
@ -662,3 +662,153 @@ func TestGnosisCustomDataWithChainId(t *testing.T) {
|
||||
t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash)
|
||||
}
|
||||
}
|
||||
|
||||
var complexTypedData = `
|
||||
{
|
||||
"types": {
|
||||
"EIP712Domain": [
|
||||
{
|
||||
"name": "chainId",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "verifyingContract",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"Action": [
|
||||
{
|
||||
"name": "action",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "params",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"Cell": [
|
||||
{
|
||||
"name": "capacity",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "lock",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "data",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "extraData",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"Transaction": [
|
||||
{
|
||||
"name": "DAS_MESSAGE",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "inputsCapacity",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "outputsCapacity",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "fee",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "action",
|
||||
"type": "Action"
|
||||
},
|
||||
{
|
||||
"name": "inputs",
|
||||
"type": "Cell[]"
|
||||
},
|
||||
{
|
||||
"name": "outputs",
|
||||
"type": "Cell[]"
|
||||
},
|
||||
{
|
||||
"name": "digest",
|
||||
"type": "bytes32"
|
||||
}
|
||||
]
|
||||
},
|
||||
"primaryType": "Transaction",
|
||||
"domain": {
|
||||
"chainId": "56",
|
||||
"name": "da.systems",
|
||||
"verifyingContract": "0x0000000000000000000000000000000020210722",
|
||||
"version": "1"
|
||||
},
|
||||
"message": {
|
||||
"DAS_MESSAGE": "SELL mobcion.bit FOR 100000 CKB",
|
||||
"inputsCapacity": "1216.9999 CKB",
|
||||
"outputsCapacity": "1216.9998 CKB",
|
||||
"fee": "0.0001 CKB",
|
||||
"digest": "0x53a6c0f19ec281604607f5d6817e442082ad1882bef0df64d84d3810dae561eb",
|
||||
"action": {
|
||||
"action": "start_account_sale",
|
||||
"params": "0x00"
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"capacity": "218 CKB",
|
||||
"lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...",
|
||||
"type": "account-cell-type,0x01,0x",
|
||||
"data": "{ account: mobcion.bit, expired_at: 1670913958 }",
|
||||
"extraData": "{ status: 0, records_hash: 0x55478d76900611eb079b22088081124ed6c8bae21a05dd1a0d197efcc7c114ce }"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"capacity": "218 CKB",
|
||||
"lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...",
|
||||
"type": "account-cell-type,0x01,0x",
|
||||
"data": "{ account: mobcion.bit, expired_at: 1670913958 }",
|
||||
"extraData": "{ status: 1, records_hash: 0x55478d76900611eb079b22088081124ed6c8bae21a05dd1a0d197efcc7c114ce }"
|
||||
},
|
||||
{
|
||||
"capacity": "201 CKB",
|
||||
"lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...",
|
||||
"type": "account-sale-cell-type,0x01,0x",
|
||||
"data": "0x1209460ef3cb5f1c68ed2c43a3e020eec2d9de6e...",
|
||||
"extraData": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
func TestComplexTypedData(t *testing.T) {
|
||||
var td apitypes.TypedData
|
||||
err := json.Unmarshal([]byte(complexTypedData), &td)
|
||||
if err != nil {
|
||||
t.Fatalf("unmarshalling failed '%v'", err)
|
||||
}
|
||||
_, sighash, err := sign(td)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expSigHash := common.FromHex("0x42b1aca82bb6900ff75e90a136de550a58f1a220a071704088eabd5e6ce20446")
|
||||
if !bytes.Equal(expSigHash, sighash) {
|
||||
t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user