@@ -172,25 +172,56 @@ ACCESS_KEY="$(wallet_json_field "$access_wallet_json" private_key)"
172172ACCESS_KEY_ADDR=" $( wallet_json_field " $access_wallet_json " address) "
173173printf " 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
178180if [[ " $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
184192else
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 "
194225fi
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+
209242echo -e " \n=== CAST KEYCHAIN: AUTHORIZE ==="
210243kc_wallet_json=" $( cast wallet new --json) "
211244KC_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
278311fi
279312echo " 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
281339if [[ " $HARDFORK_UPPER " == " T6" ]]; then
282340 echo -e " \n=== CAST KEYCHAIN: T6 AUTHORIZE ADMIN ==="
0 commit comments