|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" |
| 5 | +cd "$ROOT_DIR" |
| 6 | + |
| 7 | +AGCLI_HOME="${AGCLI_HOME:-/tmp/agcli-write-dryrun-smoke}" |
| 8 | +AG_BIN="${AG_BIN:-}" |
| 9 | +TMP_DIR="${AGCLI_SMOKE_TMP:-/tmp/agcli-write-dryrun-run}" |
| 10 | +PROFILE_NAME="${AGCLI_PROFILE:-smoke-write}" |
| 11 | +PRIVATE_KEY_ENV="${AGCLI_PRIVATE_KEY_ENV:-AGCLI_PRIVATE_KEY}" |
| 12 | +GHST_TOKEN="${AGCLI_GHST_TOKEN:-0xcd2f22236dd9dfe2356d7c543161d4d260fd9bcb}" |
| 13 | + |
| 14 | +rm -rf "$TMP_DIR" |
| 15 | +mkdir -p "$TMP_DIR" |
| 16 | + |
| 17 | +if [[ -n "$AG_BIN" ]]; then |
| 18 | + AG_CMD=("$AG_BIN") |
| 19 | +else |
| 20 | + AG_CMD=(npx tsx src/index.ts) |
| 21 | +fi |
| 22 | + |
| 23 | +if [[ -z "${!PRIVATE_KEY_ENV:-}" ]]; then |
| 24 | + printf -v "$PRIVATE_KEY_ENV" "%s" "0x1111111111111111111111111111111111111111111111111111111111111111" |
| 25 | + export "$PRIVATE_KEY_ENV" |
| 26 | +fi |
| 27 | + |
| 28 | +pass=0 |
| 29 | +fail=0 |
| 30 | +LAST_OUT="$TMP_DIR/last.json" |
| 31 | +LAST_ERR="$TMP_DIR/last.err" |
| 32 | + |
| 33 | +run_json() { |
| 34 | + local name="$1" |
| 35 | + shift |
| 36 | + |
| 37 | + echo "--- $name" |
| 38 | + if AGCLI_HOME="$AGCLI_HOME" "${AG_CMD[@]}" "$@" --json >"$LAST_OUT" 2>"$LAST_ERR"; then |
| 39 | + if node -e 'const fs=require("fs");const p=process.argv[1];const d=JSON.parse(fs.readFileSync(p,"utf8"));if(d.status!=="ok"){process.exit(1)}' "$LAST_OUT"; then |
| 40 | + echo "PASS" |
| 41 | + pass=$((pass + 1)) |
| 42 | + return 0 |
| 43 | + fi |
| 44 | + fi |
| 45 | + |
| 46 | + echo "FAIL" |
| 47 | + cat "$LAST_ERR" || true |
| 48 | + cat "$LAST_OUT" || true |
| 49 | + fail=$((fail + 1)) |
| 50 | + return 1 |
| 51 | +} |
| 52 | + |
| 53 | +run_expect_error() { |
| 54 | + local name="$1" |
| 55 | + local expected_code="$2" |
| 56 | + shift 2 |
| 57 | + |
| 58 | + echo "--- $name" |
| 59 | + if AGCLI_HOME="$AGCLI_HOME" "${AG_CMD[@]}" "$@" --json >"$LAST_OUT" 2>"$LAST_ERR"; then |
| 60 | + echo "FAIL (expected error $expected_code but command succeeded)" |
| 61 | + cat "$LAST_OUT" || true |
| 62 | + fail=$((fail + 1)) |
| 63 | + return 1 |
| 64 | + fi |
| 65 | + |
| 66 | + if node -e 'const fs=require("fs");const p=process.argv[1];const expected=process.argv[2];const d=JSON.parse(fs.readFileSync(p,"utf8"));if(d.status!=="error"||d.error?.code!==expected){process.exit(1)}' "$LAST_ERR" "$expected_code"; then |
| 67 | + echo "PASS" |
| 68 | + pass=$((pass + 1)) |
| 69 | + return 0 |
| 70 | + fi |
| 71 | + |
| 72 | + echo "FAIL (unexpected error payload)" |
| 73 | + cat "$LAST_ERR" || true |
| 74 | + fail=$((fail + 1)) |
| 75 | + return 1 |
| 76 | +} |
| 77 | + |
| 78 | +extract_json() { |
| 79 | + local path="$1" |
| 80 | + local expr="$2" |
| 81 | + node -e "const fs=require('fs'); const d=JSON.parse(fs.readFileSync(process.argv[1],'utf8')); const v=(${expr}); if(v===undefined||v===null){process.exit(1)} process.stdout.write(String(v));" "$path" |
| 82 | +} |
| 83 | + |
| 84 | +APPROVE_ABI="$TMP_DIR/approve.json" |
| 85 | +cat >"$APPROVE_ABI" <<'JSON' |
| 86 | +[ |
| 87 | + { |
| 88 | + "type": "function", |
| 89 | + "name": "approve", |
| 90 | + "stateMutability": "nonpayable", |
| 91 | + "inputs": [ |
| 92 | + { "name": "spender", "type": "address" }, |
| 93 | + { "name": "amount", "type": "uint256" } |
| 94 | + ], |
| 95 | + "outputs": [ |
| 96 | + { "name": "", "type": "bool" } |
| 97 | + ] |
| 98 | + } |
| 99 | +] |
| 100 | +JSON |
| 101 | + |
| 102 | +run_json "bootstrap env signer profile" bootstrap --mode agent --profile "$PROFILE_NAME" --chain base --signer "env:$PRIVATE_KEY_ENV" |
| 103 | +run_json "signer check" signer check --profile "$PROFILE_NAME" |
| 104 | +cp "$LAST_OUT" "$TMP_DIR/signer-check.json" |
| 105 | +SIGNER_ADDRESS="$(extract_json "$TMP_DIR/signer-check.json" 'd.data?.signer?.address')" |
| 106 | + |
| 107 | +run_json "tx send dry-run" tx send --profile "$PROFILE_NAME" --to "$SIGNER_ADDRESS" --value-wei 0 --dry-run |
| 108 | +run_expect_error "tx send dry-run + wait" "INVALID_ARGUMENT" tx send --profile "$PROFILE_NAME" --to "$SIGNER_ADDRESS" --value-wei 0 --dry-run --wait |
| 109 | + |
| 110 | +run_json "onchain send dry-run (approve)" onchain send --profile "$PROFILE_NAME" --abi-file "$APPROVE_ABI" --address "$GHST_TOKEN" --function approve --args-json "[\"$SIGNER_ADDRESS\",\"1\"]" --dry-run |
| 111 | +run_expect_error "onchain send dry-run + wait" "INVALID_ARGUMENT" onchain send --profile "$PROFILE_NAME" --abi-file "$APPROVE_ABI" --address "$GHST_TOKEN" --function approve --args-json "[\"$SIGNER_ADDRESS\",\"1\"]" --dry-run --wait |
| 112 | + |
| 113 | +run_json "mapped token approve dry-run" token approve --profile "$PROFILE_NAME" --abi-file "$APPROVE_ABI" --address "$GHST_TOKEN" --args-json "[\"$SIGNER_ADDRESS\",\"1\"]" --dry-run |
| 114 | + |
| 115 | +echo "RESULT pass=$pass fail=$fail" |
| 116 | +if [[ "$fail" -ne 0 ]]; then |
| 117 | + exit 1 |
| 118 | +fi |
0 commit comments