Skip to content

Commit 529d166

Browse files
decofeDaniPopes
andauthored
fix(ci): support TIP-1099 key authorization (#16527)
Provision access keys through transaction key authorization when direct AccountKeychain selectors are unavailable. Keep legacy selector coverage on pre-TIP-1099 networks. Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
1 parent 696b224 commit 529d166

1 file changed

Lines changed: 67 additions & 9 deletions

File tree

.github/scripts/tempo-check.sh

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,25 +172,56 @@ ACCESS_KEY="$(wallet_json_field "$access_wallet_json" private_key)"
172172
ACCESS_KEY_ADDR="$(wallet_json_field "$access_wallet_json" address)"
173173
printf "Access key address: %s\n" "$ACCESS_KEY_ADDR"
174174

175-
# Authorize the access key on-chain first (required for gas estimation)
176-
# Account Keychain precompile: 0xAAAAAAAA00000000000000000000000000000000
177-
# SignatureType: 0 = Secp256k1, Expiry: 1893456000 (year 2030), enforceLimits: false, limits: [], allowAnyCalls: true
175+
# Authorize the access key on-chain first (required for gas estimation). TIP-1099 removes
176+
# direct AccountKeychain authorization, so fall back to transaction-embedded authorization when
177+
# the selector is unavailable. Keep probing the selector instead of trusting TEMPO_HARDFORK: the
178+
# workflow label may name an older lane while a newer fork is active in the generated genesis.
179+
DIRECT_KEYCHAIN_AUTH=true
178180
if [[ "$HARDFORK" == "T2" ]]; then
179-
# Legacy: authorizeKey with flat params (pre-T3)
180-
cast send --rpc-url "$ETH_RPC_URL" 0xAAAAAAAA00000000000000000000000000000000 \
181+
# Legacy: authorizeKey with flat params (pre-T3).
182+
if ! DIRECT_AUTH_OUTPUT=$(cast send --rpc-url "$ETH_RPC_URL" 0xAAAAAAAA00000000000000000000000000000000 \
181183
'authorizeKey(address,uint8,uint64,bool,(address,uint256)[])' \
182184
"$ACCESS_KEY_ADDR" 0 1893456000 false "[]" \
183-
--private-key "$PK"
185+
--private-key "$PK" 2>&1); then
186+
echo "$DIRECT_AUTH_OUTPUT"
187+
[[ "$DIRECT_AUTH_OUTPUT" == *"UnknownFunctionSelector"* ]] || exit 1
188+
DIRECT_KEYCHAIN_AUTH=false
189+
else
190+
echo "$DIRECT_AUTH_OUTPUT"
191+
fi
184192
else
185-
# TIP-1011 (T3+): authorizeKey takes a KeyRestrictions struct
193+
# TIP-1011 (T3+): authorizeKey takes a KeyRestrictions struct.
186194
# KeyRestrictions = (uint64 expiry, bool enforceLimits, TokenLimit[] limits, bool allowAnyCalls, CallScope[] allowedCalls)
187195
# TokenLimit = (address token, uint256 amount, uint64 period)
188196
# CallScope = (address target, SelectorRule[] selectorRules)
189197
# SelectorRule = (bytes4 selector, address[] recipients)
190-
cast send --rpc-url "$ETH_RPC_URL" 0xAAAAAAAA00000000000000000000000000000000 \
198+
if ! DIRECT_AUTH_OUTPUT=$(cast send --rpc-url "$ETH_RPC_URL" 0xAAAAAAAA00000000000000000000000000000000 \
191199
'authorizeKey(address,uint8,(uint64,bool,(address,uint256,uint64)[],bool,(address,(bytes4,address[])[])[])) ' \
192200
"$ACCESS_KEY_ADDR" 0 "(1893456000,false,[],true,[])" \
193-
--private-key "$PK"
201+
--private-key "$PK" 2>&1); then
202+
echo "$DIRECT_AUTH_OUTPUT"
203+
[[ "$DIRECT_AUTH_OUTPUT" == *"UnknownFunctionSelector"* ]] || exit 1
204+
DIRECT_KEYCHAIN_AUTH=false
205+
else
206+
echo "$DIRECT_AUTH_OUTPUT"
207+
fi
208+
fi
209+
210+
if [[ "$DIRECT_KEYCHAIN_AUTH" == "false" ]]; then
211+
echo "Direct key authorization unavailable; provisioning with transaction key_authorization"
212+
export TEMPO_HOME="$tmp_dir/tempo-home"
213+
CHAIN_ID=$(cast chain-id --rpc-url "$ETH_RPC_URL")
214+
AUTHORIZATION=$(cast key-authorization sign "$ACCESS_KEY_ADDR" \
215+
--chain-id "$CHAIN_ID" \
216+
--expiry 1893456000 \
217+
--private-key "$PK")
218+
cast tempo import-access-key \
219+
--account "$ADDR" \
220+
--access-key "$ACCESS_KEY" \
221+
--authorization "$AUTHORIZATION"
222+
cast send ${FEE_TOKEN_ARG[@]+"${FEE_TOKEN_ARG[@]}"} --rpc-url "$ETH_RPC_URL" \
223+
0x86A2EE8FAf9A840F7a2c64CA3d51209F9A02081D 'increment()' \
224+
--from "$ADDR"
194225
fi
195226

196227
# Fund the access key address (needed for gas)
@@ -206,6 +237,8 @@ cast send ${FEE_TOKEN_ARG[@]+"${FEE_TOKEN_ARG[@]}"} --rpc-url "$ETH_RPC_URL" 0x8
206237

207238
# --- cast keychain subcommand tests ---
208239

240+
if [[ "$DIRECT_KEYCHAIN_AUTH" == "true" ]]; then
241+
209242
echo -e "\n=== CAST KEYCHAIN: AUTHORIZE ==="
210243
kc_wallet_json="$(cast wallet new --json)"
211244
KC_KEY_PK="$(wallet_json_field "$kc_wallet_json" private_key)"
@@ -277,6 +310,31 @@ if cast keychain auth "$KC_LIMITED_ADDR" secp256k1 1893456000 \
277310
exit 1
278311
fi
279312
echo "OK: duplicate authorize correctly rejected"
313+
else
314+
echo -e "\n=== SKIPPING DIRECT KEYCHAIN AUTHORIZATION TESTS (TIP-1099 ACTIVE) ==="
315+
316+
echo -e "\n=== CAST KEYCHAIN: KEY-INFO ==="
317+
KC_INFO=$(cast keychain info "$ADDR" "$ACCESS_KEY_ADDR" --rpc-url "$ETH_RPC_URL")
318+
echo "$KC_INFO"
319+
echo "$KC_INFO" | grep -q "secp256k1"
320+
321+
echo -e "\n=== CAST KEYCHAIN: REVOKE ==="
322+
cast keychain rev "$ACCESS_KEY_ADDR" \
323+
--rpc-url "$ETH_RPC_URL" --private-key "$PK" ${FEE_TOKEN_ARG[@]+"${FEE_TOKEN_ARG[@]}"}
324+
325+
KC_INFO_REV=$(cast keychain info "$ADDR" "$ACCESS_KEY_ADDR" --rpc-url "$ETH_RPC_URL")
326+
echo "$KC_INFO_REV"
327+
echo "$KC_INFO_REV" | grep -q "revoked"
328+
329+
echo -e "\n=== CAST KEYCHAIN: REVOKED KEY REJECTION ==="
330+
if cast send ${FEE_TOKEN_ARG[@]+"${FEE_TOKEN_ARG[@]}"} --rpc-url "$ETH_RPC_URL" \
331+
0x86A2EE8FAf9A840F7a2c64CA3d51209F9A02081D 'increment()' \
332+
--tempo.access-key "$ACCESS_KEY" --tempo.root-account "$ADDR" 2>&1; then
333+
echo "ERROR: revoked key should have been rejected"
334+
exit 1
335+
fi
336+
echo "OK: revoked key correctly rejected"
337+
fi
280338

281339
if [[ "$HARDFORK_UPPER" == "T6" ]]; then
282340
echo -e "\n=== CAST KEYCHAIN: T6 AUTHORIZE ADMIN ==="

0 commit comments

Comments
 (0)