Skip to content

Commit 3751854

Browse files
committed
add keccak256 native
1 parent 34f5971 commit 3751854

File tree

13 files changed

+290
-13
lines changed

13 files changed

+290
-13
lines changed

docs/en/pact-functions.md

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ Return ID if called during current pact execution, failing if not.
461461
Obtain current pact build version.
462462
```lisp
463463
pact> (pact-version)
464-
"4.10"
464+
"4.11"
465465
```
466466

467467
Top level only: this function will fail if used in module code.
@@ -1796,7 +1796,25 @@ pact> (scalar-mult 'g1 {'x: 1, 'y: 2} 2)
17961796
{"x": 1368015179489954701390400359078579693043519447331113978918064868415326638035,"y": 9918110051302171585080402603319702774565515993150576347155970296011118125764}
17971797
```
17981798

1799-
## Poseidon Hash {#Poseidon Hash}
1799+
## Hashes {#Hashes}
1800+
1801+
### hash-keccak256 {#hash-keccak256}
1802+
1803+
*bytes* `[string]` *→* `string`
1804+
1805+
1806+
Compute the hash of a list of unpadded base64url-encoded inputs. The hash is computed incrementally over all of the decoded inputs.
1807+
```lisp
1808+
pact> (hash-keccak256 [])
1809+
"xdJGAYb3IzySfn2y3McDwOUAtlPKgic7e_rYBF2FpHA"
1810+
pact> (hash-keccak256 [""])
1811+
"xdJGAYb3IzySfn2y3McDwOUAtlPKgic7e_rYBF2FpHA"
1812+
pact> (hash-keccak256 ["T73FllCNJKKgAQ4UCYC4CfucbVXsdRJYkd2YXTdmW9gPm-tqUCB1iKvzzu6Md82KWtSKngqgdO04hzg2JJbS-yyHVDuzNJ6mSZfOPntCTqktEi9X27CFWoAwWEN_4Ir7DItecXm5BEu_TYGnFjsxOeMIiLU2sPlX7_macWL0ylqnVqSpgt-tvzHvJVCDxLXGwbmaEH19Ov_9uJFHwsxMmiZD9Hjl4tOTrqN7THy0tel9rc8WtrUKrg87VJ7OR3Rtts5vZ91EBs1OdVldUQPRP536eTcpJNMo-N0fy-taji6L9Mdt4I4_xGqgIfmJxJMpx6ysWmiFVte8vLKl1L5p0yhOnEDsSDjuhZISDOIKC2NeytqoT9VpBQn1T3fjWkF8WEZIvJg5uXTge_qwA46QKV0LE5AlMKgw0cK91T8fnJ-u1Dyk7tCo3XYbx-292iiih8YM1Cr1-cdY5cclAjHAmlglY2ia_GXit5p6K2ggBmd1LpEBdG8DGE4jmeTtiDXLjprpDilq8iCuI0JZ_gvQvMYPekpf8_cMXtTenIxRmhDpYvZzyCxek1F4aoo7_VcAMYV71Mh_T8ox7U1Q4U8hB9oCy1BYcAt06iQai0HXhGFljxsrkL_YSkwsnWVDhhqzxWRRdX3PubpgMzSI290C1gG0Gq4xfKdHTrbm3Q"])
1813+
"DqM-LjT1ckQGQCRMfx9fBGl86XE5vacqZVjYZjwCs4g"
1814+
pact> (hash-keccak256 ["T73FllCNJKKgAQ4UCYC4CfucbVXsdRJYkd2YXTdmW9g", "D5vralAgdYir887ujHfNilrUip4KoHTtOIc4NiSW0vs", "LIdUO7M0nqZJl84-e0JOqS0SL1fbsIVagDBYQ3_givs", "DItecXm5BEu_TYGnFjsxOeMIiLU2sPlX7_macWL0ylo", "p1akqYLfrb8x7yVQg8S1xsG5mhB9fTr__biRR8LMTJo", "JkP0eOXi05Ouo3tMfLS16X2tzxa2tQquDztUns5HdG0", "ts5vZ91EBs1OdVldUQPRP536eTcpJNMo-N0fy-taji4", "i_THbeCOP8RqoCH5icSTKcesrFpohVbXvLyypdS-adM", "KE6cQOxIOO6FkhIM4goLY17K2qhP1WkFCfVPd-NaQXw", "WEZIvJg5uXTge_qwA46QKV0LE5AlMKgw0cK91T8fnJ8", "rtQ8pO7QqN12G8ftvdoooofGDNQq9fnHWOXHJQIxwJo", "WCVjaJr8ZeK3mnoraCAGZ3UukQF0bwMYTiOZ5O2INcs", "jprpDilq8iCuI0JZ_gvQvMYPekpf8_cMXtTenIxRmhA", "6WL2c8gsXpNReGqKO_1XADGFe9TIf0_KMe1NUOFPIQc", "2gLLUFhwC3TqJBqLQdeEYWWPGyuQv9hKTCydZUOGGrM", "xWRRdX3PubpgMzSI290C1gG0Gq4xfKdHTrbm3Q"])
1815+
"DqM-LjT1ckQGQCRMfx9fBGl86XE5vacqZVjYZjwCs4g"
1816+
```
1817+
18001818

18011819
### poseidon-hash-hack-a-chain {#poseidon-hash-hack-a-chain}
18021820

@@ -1822,9 +1840,9 @@ pact> (poseidon-hash-hack-a-chain 1 2 3 4 5 6 7 8)
18221840
*x* `string` *→* `object:*`
18231841

18241842

1825-
Decode a base-64 encoded Hyperlane Token Message into an object `{recipient:GUARD, amount:DECIMAL, chainId:STRING}`.
1843+
Decode a base-64-unpadded encoded Hyperlane Token Message into an object `{recipient:GUARD, amount:DECIMAL, chainId:STRING}`.
18261844
```lisp
1827-
pact> (hyperlane-decode-token-message "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGF7InByZWQiOiAia2V5cy1hbGwiLCAia2V5cyI6WyJkYTFhMzM5YmQ4MmQyYzJlOTE4MDYyNmEwMGRjMDQzMjc1ZGViM2FiYWJiMjdiNTczOGFiZjZiOWRjZWU4ZGI2Il19AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")
1845+
pact> (hyperlane-decode-token-message "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGF7InByZWQiOiAia2V5cy1hbGwiLCAia2V5cyI6WyJkYTFhMzM5YmQ4MmQyYzJlOTE4MDYyNmEwMGRjMDQzMjc1ZGViM2FiYWJiMjdiNTczOGFiZjZiOWRjZWU4ZGI2Il19AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
18281846
{"amount": 0.000000000000000123,"chainId": "4","recipient": KeySet {keys: [da1a339bd82d2c2e9180626a00dc043275deb3ababb27b5738abf6b9dcee8db6],pred: keys-all}}
18291847
```
18301848

@@ -1983,7 +2001,7 @@ Retreive any accumulated events and optionally clear event state. Object returne
19832001
*→* `[string]`
19842002

19852003

1986-
Queries, or with arguments, sets execution config flags. Valid flags: ["AllowReadInLocal","DisableHistoryInTransactionalMode","DisableInlineMemCheck","DisableModuleInstall","DisableNewTrans","DisablePact40","DisablePact410","DisablePact411","DisablePact42","DisablePact43","DisablePact431","DisablePact44","DisablePact45","DisablePact46","DisablePact47","DisablePact48","DisablePact49","DisablePactEvents","DisableRuntimeReturnTypeChecking","EnforceKeyFormats","OldReadOnlyBehavior","PreserveModuleIfacesBug","PreserveModuleNameBug","PreserveNsModuleInstallBug","PreserveShowDefs"]
2004+
Queries, or with arguments, sets execution config flags. Valid flags: ["AllowReadInLocal","DisableHistoryInTransactionalMode","DisableInlineMemCheck","DisableModuleInstall","DisableNewTrans","DisablePact40","DisablePact410","DisablePact411","DisablePact412","DisablePact42","DisablePact43","DisablePact431","DisablePact44","DisablePact45","DisablePact46","DisablePact47","DisablePact48","DisablePact49","DisablePactEvents","DisableRuntimeReturnTypeChecking","EnforceKeyFormats","OldReadOnlyBehavior","PreserveModuleIfacesBug","PreserveModuleNameBug","PreserveNsModuleInstallBug","PreserveShowDefs"]
19872005
```lisp
19882006
pact> (env-exec-config ['DisableHistoryInTransactionalMode]) (env-exec-config)
19892007
["DisableHistoryInTransactionalMode"]

golden/gas-model/golden

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@
126126
- 5
127127
- - (hash smallOjectMap)
128128
- 5
129+
- - |-
130+
(hash-keccak256 [])
131+
(hash-keccak256 [""])
132+
(hash-keccak256 ["IP9FQ2ml0FuBp489sFgZ_qmwjCOE91ywq2qhFd1pDaMTGHShyo9witFRnqlSweJJy1QNGWOSx56HdVQk_ufIkICMViciNZ7qUuihL7u5ad15YdK6UgN0k3VaX6BPDVChqibJtEFIwNO5TRxKWaMayhWui9RKy3gz2OkcS4b6MTWkIzh7gVG0Ez7SP21xh7UOwiBK2QGtdNOW5EJ04OyvquF7O5CF4iJgs1ylOxXMUqu6dYr2eY-9BOzuztZI869P2z3tdVeppc-3OCYSqKjz9FlH0aKc4pByko7Bk8ol1RBxvV4ZhOz0AvMG6nYvDyUoL1KW2Zdli-P5g2lv-m0JXGNptNr3nppdMTYikSj462PBK56fp4r_ej6eGaYgIkk80Tbe-7W7e6G5OPNn_S9j61ynbAsP8hueNsPwcjDPPDB05dpYcECnaXXX459ElKzlSG_L84CrdVjE_ollYzW4Lk24ZZUJ6rRqGWExJuWUBCcy3UxBH0GqjN6sccD7QKlObaVYwF53thgoBvJtmv3z2gDGlBkiLIGGpu-tYAtBDmzi8qeX5J3B8TUxmAH6bzlrBvl14qGQoCPkdLYY5w"])
133+
(hash-keccak256 ["IP9FQ2ml0FuBp489sFgZ_qmwjCOE91ywq2qhFd1pDaM", "Exh0ocqPcIrRUZ6pUsHiSctUDRljkseeh3VUJP7nyJA", "gIxWJyI1nupS6KEvu7lp3Xlh0rpSA3STdVpfoE8NUKE", "qibJtEFIwNO5TRxKWaMayhWui9RKy3gz2OkcS4b6MTU", "pCM4e4FRtBM-0j9tcYe1DsIgStkBrXTTluRCdODsr6o", "4Xs7kIXiImCzXKU7FcxSq7p1ivZ5j70E7O7O1kjzr08", "2z3tdVeppc-3OCYSqKjz9FlH0aKc4pByko7Bk8ol1RA", "cb1eGYTs9ALzBup2Lw8lKC9SltmXZYvj-YNpb_ptCVw", "Y2m02veeml0xNiKRKPjrY8Ernp-niv96Pp4ZpiAiSTw", "0Tbe-7W7e6G5OPNn_S9j61ynbAsP8hueNsPwcjDPPDA", "dOXaWHBAp2l11-OfRJSs5Uhvy_OAq3VYxP6JZWM1uC4", "TbhllQnqtGoZYTEm5ZQEJzLdTEEfQaqM3qxxwPtAqU4", "baVYwF53thgoBvJtmv3z2gDGlBkiLIGGpu-tYAtBDmw", "4vKnl-SdwfE1MZgB-m85awb5deKhkKAj5HS2GOc"])
134+
(hash-keccak256 ["T73FllCNJKKgAQ4UCYC4CfucbVXsdRJYkd2YXTdmW9gPm-tqUCB1iKvzzu6Md82KWtSKngqgdO04hzg2JJbS-yyHVDuzNJ6mSZfOPntCTqktEi9X27CFWoAwWEN_4Ir7DItecXm5BEu_TYGnFjsxOeMIiLU2sPlX7_macWL0ylqnVqSpgt-tvzHvJVCDxLXGwbmaEH19Ov_9uJFHwsxMmiZD9Hjl4tOTrqN7THy0tel9rc8WtrUKrg87VJ7OR3Rtts5vZ91EBs1OdVldUQPRP536eTcpJNMo-N0fy-taji6L9Mdt4I4_xGqgIfmJxJMpx6ysWmiFVte8vLKl1L5p0yhOnEDsSDjuhZISDOIKC2NeytqoT9VpBQn1T3fjWkF8WEZIvJg5uXTge_qwA46QKV0LE5AlMKgw0cK91T8fnJ-u1Dyk7tCo3XYbx-292iiih8YM1Cr1-cdY5cclAjHAmlglY2ia_GXit5p6K2ggBmd1LpEBdG8DGE4jmeTtiDXLjprpDilq8iCuI0JZ_gvQvMYPekpf8_cMXtTenIxRmhDpYvZzyCxek1F4aoo7_VcAMYV71Mh_T8ox7U1Q4U8hB9oCy1BYcAt06iQai0HXhGFljxsrkL_YSkwsnWVDhhqzxWRRdX3PubpgMzSI290C1gG0Gq4xfKdHTrbm3Q"])
135+
- 44
129136
- - (* longNumber longNumber)
130137
- 3
131138
- - (* medNumber medNumber)

pact.cabal

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ library
9696
cbits/musl/sqrt_data.c
9797
exposed-modules:
9898
Crypto.Hash.Blake2Native
99+
Crypto.Hash.Keccak256Native
99100
Crypto.Hash.HyperlaneMessageId
100101
Crypto.Hash.PoseidonNative
101102
Pact.Analyze.Remote.Types
@@ -222,11 +223,12 @@ library
222223
, direct-sqlite >=2.3.27
223224
, directory >=1.2.6.2
224225
, errors >=2.3
226+
, ethereum >= 0.1
225227
, exceptions >=0.8.3
226228
, filepath >=1.4.1.0
227229
, groups
228230
, hashable >=1.4
229-
, ethereum >= 0.1
231+
, hashes >= 0.2
230232
, lens >=4.14
231233
, megaparsec >=9
232234
, memory
@@ -421,6 +423,7 @@ test-suite hspec
421423
, attoparsec
422424
, base
423425
, base16-bytestring
426+
, base64-bytestring
424427
, bound
425428
, bytestring
426429
, containers
@@ -471,6 +474,7 @@ test-suite hspec
471474
GoldenSpec
472475
HistoryServiceSpec
473476
HyperlaneSpec
477+
Keccak256Spec
474478
PactContinuationSpec
475479
PersistSpec
476480
PoseidonSpec

src/Crypto/Hash/Keccak256Native.hs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE DeriveAnyClass #-}
3+
{-# LANGUAGE DerivingStrategies #-}
4+
{-# LANGUAGE ImportQualifiedPost #-}
5+
{-# LANGUAGE OverloadedStrings #-}
6+
{-# LANGUAGE RankNTypes #-}
7+
{-# LANGUAGE ScopedTypeVariables #-}
8+
{-# LANGUAGE TypeApplications #-}
9+
10+
-- | Implementation of the `keccak256` pact native.
11+
--
12+
-- `keccak256` takes as input a Pact object representing a
13+
-- 'HyperlaneMessage', and returns a base16-encoded hash of the abi-encoding
14+
-- of the input.
15+
module Crypto.Hash.Keccak256Native (Keccak256Error(..), keccak256) where
16+
17+
import Control.Exception (Exception(..), SomeException(..), try)
18+
import Control.Monad (forM_)
19+
import Control.Monad.Catch (throwM)
20+
import Data.ByteString.Short qualified as BSS
21+
import Data.Hash.Class.Mutable (initialize, finalize, updateByteString)
22+
import Data.Hash.Internal.OpenSSL (OpenSslException(..))
23+
import Data.Hash.Keccak (Keccak256(..))
24+
import Data.Text (Text)
25+
import Data.Text.Encoding qualified as Text
26+
import Data.Vector (Vector)
27+
import Pact.Types.Util (encodeBase64UrlUnpadded, decodeBase64UrlUnpadded)
28+
import System.IO.Unsafe (unsafePerformIO)
29+
30+
data Keccak256Error
31+
= Keccak256OpenSslException String
32+
| Keccak256Base64Exception String
33+
deriving stock (Eq, Show)
34+
deriving anyclass (Exception)
35+
36+
keccak256 :: Vector Text -> Either Keccak256Error Text
37+
keccak256 strings = unsafePerformIO $ do
38+
e <- try @SomeException @_ $ do
39+
ctx <- initialize @Keccak256
40+
forM_ strings $ \string -> do
41+
case decodeBase64UrlUnpadded (Text.encodeUtf8 string) of
42+
Left b64Err -> do
43+
throwM (Keccak256Base64Exception b64Err)
44+
Right bytes -> do
45+
updateByteString @Keccak256 ctx bytes
46+
Keccak256 hash <- finalize ctx
47+
pure (BSS.fromShort hash)
48+
case e of
49+
Left err
50+
| Just (OpenSslException msg) <- fromException err -> pure (Left (Keccak256OpenSslException msg))
51+
| Just (exc :: Keccak256Error) <- fromException err -> pure (Left exc)
52+
| otherwise -> error "keccak256 failed"
53+
Right hash -> pure (Right (Text.decodeUtf8 (encodeBase64UrlUnpadded hash)))
54+
{-# noinline keccak256 #-}

src/Pact/Gas/Table.hs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ data GasCostConfig = GasCostConfig
5757
, _gasCostConfig_poseidonHashHackAChainLinearGasFactor :: Gas
5858
, _gasCostConfig_hyperlaneMessageIdGasPerRecipientOneHundredBytes :: MilliGas
5959
, _gasCostConfig_hyperlaneDecodeTokenMessageGasPerOneHundredBytes :: MilliGas
60+
, _gasCostConfig_keccak256GasPerOneHundredBytes :: MilliGas
61+
, _gasCostConfig_keccak256GasPerChunk :: MilliGas
6062
}
6163

6264
defaultGasConfig :: GasCostConfig
@@ -85,6 +87,8 @@ defaultGasConfig = GasCostConfig
8587
, _gasCostConfig_poseidonHashHackAChainQuadraticGasFactor = 38
8688
, _gasCostConfig_hyperlaneMessageIdGasPerRecipientOneHundredBytes = MilliGas 47
8789
, _gasCostConfig_hyperlaneDecodeTokenMessageGasPerOneHundredBytes = MilliGas 50
90+
, _gasCostConfig_keccak256GasPerOneHundredBytes = MilliGas 146
91+
, _gasCostConfig_keccak256GasPerChunk = MilliGas 2_120
8892
}
8993

9094
defaultGasTable :: Map Text Gas
@@ -242,6 +246,7 @@ defaultGasTable =
242246
,("poseidon-hash-hack-a-chain", 124)
243247
,("hyperlane-message-id", 2)
244248
,("hyperlane-decode-token-message", 2)
249+
,("hash-keccak256",1)
245250
]
246251

247252
{-# NOINLINE defaultGasTable #-}
@@ -345,6 +350,12 @@ tableGasModel gasConfig =
345350
GHyperlaneDecodeTokenMessage len ->
346351
let MilliGas costPerOneHundredBytes = _gasCostConfig_hyperlaneDecodeTokenMessageGasPerOneHundredBytes gasConfig
347352
in MilliGas (costPerOneHundredBytes * div (fromIntegral len) 100)
353+
GKeccak256 numBytesInChunk ->
354+
let MilliGas costPerOneHundredBytes = _gasCostConfig_keccak256GasPerOneHundredBytes gasConfig
355+
MilliGas costPerChunk = _gasCostConfig_keccak256GasPerChunk gasConfig
356+
-- we need to use ceiling here, otherwise someone could cheat by
357+
-- having as many bytes as they want, but in chunks of 99 bytes.
358+
in MilliGas (costPerChunk + costPerOneHundredBytes * ceiling (fromIntegral @_ @Double numBytesInChunk / 100.0))
348359

349360
in GasModel
350361
{ gasModelName = "table"

src/Pact/GasModel/GasTests.hs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ allTests = HM.fromList
228228
-- SPI/Hyperlane
229229
, ("hyperlane-message-id", hyperlaneMessageIdTests)
230230
, ("enforce-verifier", enforceVerifierTests)
231+
, ("hash-keccak256", keccak256Tests)
231232

232233
-- Non-native concepts to benchmark
233234
, ("use", useTests)
@@ -2044,3 +2045,14 @@ hyperlaneMessageIdTests = defGasUnitTest $ PactExpression hyperlaneMessageIdExpr
20442045
(hyperlane-message-id {"destinationDomain": 1,"nonce": 325,"originDomain": 626,"recipient": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F","sender": "0x6b622d746f6b656e2d726f75746572","tokenMessage": {"amount": 10000000000000000000.0,"recipient": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"},"version": 1})
20452046
(hyperlane-message-id {"destinationDomain": 1,"nonce": 325,"originDomain": 626,"recipient": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F","sender": "0x6b622d746f6b656e2d726f75746572","tokenMessage": {"amount": 10000000000000000000.0,"recipient": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},"version": 1})
20462047
|]
2048+
2049+
keccak256Tests :: NativeDefName -> GasUnitTests
2050+
keccak256Tests = defGasUnitTest $ PactExpression keccak256ExprText Nothing
2051+
where
2052+
keccak256ExprText = [text|
2053+
(hash-keccak256 [])
2054+
(hash-keccak256 [""])
2055+
(hash-keccak256 ["IP9FQ2ml0FuBp489sFgZ_qmwjCOE91ywq2qhFd1pDaMTGHShyo9witFRnqlSweJJy1QNGWOSx56HdVQk_ufIkICMViciNZ7qUuihL7u5ad15YdK6UgN0k3VaX6BPDVChqibJtEFIwNO5TRxKWaMayhWui9RKy3gz2OkcS4b6MTWkIzh7gVG0Ez7SP21xh7UOwiBK2QGtdNOW5EJ04OyvquF7O5CF4iJgs1ylOxXMUqu6dYr2eY-9BOzuztZI869P2z3tdVeppc-3OCYSqKjz9FlH0aKc4pByko7Bk8ol1RBxvV4ZhOz0AvMG6nYvDyUoL1KW2Zdli-P5g2lv-m0JXGNptNr3nppdMTYikSj462PBK56fp4r_ej6eGaYgIkk80Tbe-7W7e6G5OPNn_S9j61ynbAsP8hueNsPwcjDPPDB05dpYcECnaXXX459ElKzlSG_L84CrdVjE_ollYzW4Lk24ZZUJ6rRqGWExJuWUBCcy3UxBH0GqjN6sccD7QKlObaVYwF53thgoBvJtmv3z2gDGlBkiLIGGpu-tYAtBDmzi8qeX5J3B8TUxmAH6bzlrBvl14qGQoCPkdLYY5w"])
2056+
(hash-keccak256 ["IP9FQ2ml0FuBp489sFgZ_qmwjCOE91ywq2qhFd1pDaM", "Exh0ocqPcIrRUZ6pUsHiSctUDRljkseeh3VUJP7nyJA", "gIxWJyI1nupS6KEvu7lp3Xlh0rpSA3STdVpfoE8NUKE", "qibJtEFIwNO5TRxKWaMayhWui9RKy3gz2OkcS4b6MTU", "pCM4e4FRtBM-0j9tcYe1DsIgStkBrXTTluRCdODsr6o", "4Xs7kIXiImCzXKU7FcxSq7p1ivZ5j70E7O7O1kjzr08", "2z3tdVeppc-3OCYSqKjz9FlH0aKc4pByko7Bk8ol1RA", "cb1eGYTs9ALzBup2Lw8lKC9SltmXZYvj-YNpb_ptCVw", "Y2m02veeml0xNiKRKPjrY8Ernp-niv96Pp4ZpiAiSTw", "0Tbe-7W7e6G5OPNn_S9j61ynbAsP8hueNsPwcjDPPDA", "dOXaWHBAp2l11-OfRJSs5Uhvy_OAq3VYxP6JZWM1uC4", "TbhllQnqtGoZYTEm5ZQEJzLdTEEfQaqM3qxxwPtAqU4", "baVYwF53thgoBvJtmv3z2gDGlBkiLIGGpu-tYAtBDmw", "4vKnl-SdwfE1MZgB-m85awb5deKhkKAj5HS2GOc"])
2057+
(hash-keccak256 ["T73FllCNJKKgAQ4UCYC4CfucbVXsdRJYkd2YXTdmW9gPm-tqUCB1iKvzzu6Md82KWtSKngqgdO04hzg2JJbS-yyHVDuzNJ6mSZfOPntCTqktEi9X27CFWoAwWEN_4Ir7DItecXm5BEu_TYGnFjsxOeMIiLU2sPlX7_macWL0ylqnVqSpgt-tvzHvJVCDxLXGwbmaEH19Ov_9uJFHwsxMmiZD9Hjl4tOTrqN7THy0tel9rc8WtrUKrg87VJ7OR3Rtts5vZ91EBs1OdVldUQPRP536eTcpJNMo-N0fy-taji6L9Mdt4I4_xGqgIfmJxJMpx6ysWmiFVte8vLKl1L5p0yhOnEDsSDjuhZISDOIKC2NeytqoT9VpBQn1T3fjWkF8WEZIvJg5uXTge_qwA46QKV0LE5AlMKgw0cK91T8fnJ-u1Dyk7tCo3XYbx-292iiih8YM1Cr1-cdY5cclAjHAmlglY2ia_GXit5p6K2ggBmd1LpEBdG8DGE4jmeTtiDXLjprpDilq8iCuI0JZ_gvQvMYPekpf8_cMXtTenIxRmhDpYvZzyCxek1F4aoo7_VcAMYV71Mh_T8ox7U1Q4U8hB9oCy1BYcAt06iQai0HXhGFljxsrkL_YSkwsnWVDhhqzxWRRdX3PubpgMzSI290C1gG0Gq4xfKdHTrbm3Q"])
2058+
|]

src/Pact/Interpreter.hs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ disablePact410Natives = disablePactNatives pact410Natives FlagDisablePact410
254254
disablePact411Natives :: ExecutionConfig -> Endo RefStore
255255
disablePact411Natives = disablePactNatives pact411Natives FlagDisablePact411
256256

257+
disablePact412Natives :: ExecutionConfig -> Endo RefStore
258+
disablePact412Natives = disablePactNatives pact412Natives FlagDisablePact412
259+
257260
pact40Natives :: [Text]
258261
pact40Natives = ["enumerate" , "distinct" , "emit-event" , "concat" , "str-to-list"]
259262

@@ -278,6 +281,9 @@ pact410Natives = ["poseidon-hash-hack-a-chain"]
278281
pact411Natives :: [Text]
279282
pact411Natives = ["enforce-verifier", "hyperlane-message-id", "hyperlane-decode-token-message"]
280283

284+
pact412Natives :: [Text]
285+
pact412Natives = ["hash-keccak256"]
286+
281287
initRefStore :: RefStore
282288
initRefStore = RefStore nativeDefs
283289

@@ -292,7 +298,9 @@ versionedNativesRefStore ec = versionNatives initRefStore
292298
, disablePact46Natives ec
293299
, disablePact47Natives ec
294300
, disablePact410Natives ec
295-
, disablePact411Natives ec ]
301+
, disablePact411Natives ec
302+
, disablePact412Natives ec
303+
]
296304

297305
mkSQLiteEnv :: Logger -> Bool -> PSL.SQLiteConfig -> Loggers -> IO (PactDbEnv (DbEnv PSL.SQLite))
298306
mkSQLiteEnv initLog deleteOldFile c loggers = do

0 commit comments

Comments
 (0)