[{"data":1,"prerenderedAt":4787},["ShallowReactive",2],{"navigation_docs":3,"-operators-hyperlane-validator-v2":115,"-operators-hyperlane-validator-v2-surround":4782},[4,68,95],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":67},"Operators","i-lucide-server","/operators","1.operators",[10,15,19,24,29,34],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/operators/introduction","1.operators/1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":6},"Node Setup","/operators/node-setup","1.operators/2.node-setup",{"title":20,"path":21,"stem":22,"icon":23},"Create a Wallet","/operators/create-wallet","1.operators/3.create-wallet","i-lucide-wallet",{"title":25,"path":26,"stem":27,"icon":28},"Join as Validator","/operators/join-as-validator","1.operators/4.join-as-validator","i-lucide-shield-check",{"title":30,"path":31,"stem":32,"icon":33},"Monitoring","/operators/monitoring","1.operators/5.monitoring","i-lucide-activity",{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":67},"Hyperlane","i-lucide-link","/operators/hyperlane","1.operators/6.hyperlane",[40,45,49,53,58,63],{"title":41,"path":42,"stem":43,"icon":44},"Hyperlane Agent Keys","/operators/hyperlane/agent-keys","1.operators/6.hyperlane/1.agent-keys","i-lucide-key-round",{"title":46,"path":47,"stem":48,"icon":36},"Hyperlane Setup","/operators/hyperlane/setup","1.operators/6.hyperlane/2.setup",{"title":50,"path":51,"stem":52,"icon":28},"Run Validators","/operators/hyperlane/validators","1.operators/6.hyperlane/3.validators",{"title":54,"path":55,"stem":56,"icon":57},"Warp Token Deployment","/operators/hyperlane/warp-token","1.operators/6.hyperlane/4.warp-token","i-lucide-arrow-left-right",{"title":59,"path":60,"stem":61,"icon":62},"Testing Warp Route","/operators/hyperlane/testing-warp-route","1.operators/6.hyperlane/5.testing-warp-route","i-lucide-flask-conical",{"title":64,"path":65,"stem":66,"icon":28},"Validator V2","/operators/hyperlane/validator-v2","1.operators/6.hyperlane/6.validator-v2",false,{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":67},"Developers","i-lucide-code","/developers","2.developers",[74,77,80,85,90],{"title":11,"path":75,"stem":76,"icon":14},"/developers/introduction","2.developers/1.introduction",{"title":20,"path":78,"stem":79,"icon":23},"/developers/create-wallet","2.developers/2.create-wallet",{"title":81,"path":82,"stem":83,"icon":84},"Faucet","/developers/faucet","2.developers/3.faucet","i-lucide-coins",{"title":86,"path":87,"stem":88,"icon":89},"Chain Parameters","/developers/chain-parameters","2.developers/4.chain-parameters","i-lucide-settings",{"title":91,"path":92,"stem":93,"icon":94},"Send Transactions","/developers/send-transactions","2.developers/5.send-transactions","i-lucide-send",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":67},"Users","i-lucide-user","/users","3.users",[101,104,107,110],{"title":11,"path":102,"stem":103,"icon":14},"/users/introduction","3.users/1.introduction",{"title":20,"path":105,"stem":106,"icon":23},"/users/create-wallet","3.users/2.create-wallet",{"title":81,"path":108,"stem":109,"icon":84},"/users/faucet","3.users/3.faucet",{"title":111,"path":112,"stem":113,"icon":114},"Staking","/users/staking","3.users/4.staking","i-lucide-landmark",{"id":116,"title":64,"body":117,"description":4773,"extension":4774,"links":4775,"meta":4776,"navigation":4777,"path":65,"seo":4778,"stem":66,"__hash__":4781},"docs/1.operators/6.hyperlane/6.validator-v2.md",{"type":118,"value":119,"toc":4749},"minimark",[120,129,158,166,171,174,181,241,244,270,274,278,281,313,317,320,377,380,394,397,451,458,504,507,724,727,752,756,761,764,773,780,792,795,852,856,860,863,913,918,921,952,955,976,979,983,986,992,995,1002,1019,1029,1343,1346,1391,1395,1398,1401,1426,1429,1487,1490,1605,1609,1612,1631,1634,1709,1712,1730,1733,1762,1766,1769,1784,1787,2790,2793,2796,2903,2906,2928,2932,2935,2962,2966,2969,3297,3301,3304,3586,3593,3597,3600,3632,3635,3674,3677,3727,3730,3822,3829,3832,3834,3837,3872,3875,3972,3975,4059,4062,4085,4088,4092,4099,4102,4109,4112,4136,4139,4402,4409,4413,4416,4430,4433,4452,4455,4500,4503,4506,4525,4529,4687,4691,4694,4714,4718,4745],[121,122,123,124,128],"p",{},"This guide explains how to run the ",[125,126,127],"strong",{},"BitSong Hyperlane validator stack in production on AWS",".",[121,130,131,132,140,141,146,147,152,153,157],{},"It is based on the official Hyperlane validator guides for ",[133,134,139],"a",{"href":135,"rel":136,"target":138},"https://docs.hyperlane.xyz/docs/operate/validators/run-validators",[137],"nofollow","_blank","running validators",", ",[133,142,145],{"href":143,"rel":144,"target":138},"https://docs.hyperlane.xyz/docs/operate/validators/validator-signatures-aws",[137],"AWS signature storage",", and ",[133,148,151],{"href":149,"rel":150,"target":138},"https://docs.hyperlane.xyz/docs/operate/validators/monitoring-alerting",[137],"monitoring",", adapted for the BitSong ",[154,155,156],"code",{},"crescendo-1"," testnet and Base Sepolia.",[159,160,161,162,165],"warning",{},"This is the production-style guide. It does ",[125,163,164],{},"not"," use plaintext EVM validator private keys or local checkpoint storage. Use AWS KMS for validator signing and S3 for checkpoint storage.",[167,168,170],"h2",{"id":169},"what-you-are-running","What You Are Running",[121,172,173],{},"Hyperlane validators are not consensus validators. They are off-chain agents that watch an origin chain's Mailbox, sign message checkpoints, and publish those signatures where relayers can read them.",[121,175,176,177,180],{},"For a two-way bridge between BitSong and Base Sepolia, run ",[125,178,179],{},"two validator containers",":",[182,183,184,203],"table",{},[185,186,187],"thead",{},[188,189,190,194,197,200],"tr",{},[191,192,193],"th",{},"Container",[191,195,196],{},"Origin chain",[191,198,199],{},"What it signs",[191,201,202],{},"Why it matters",[204,205,206,225],"tbody",{},[188,207,208,214,219,222],{},[209,210,211],"td",{},[154,212,213],{},"hyperlane-validator-bitsong",[209,215,216,217],{},"BitSong ",[154,218,156],{},[209,220,221],{},"BitSong Mailbox checkpoints",[209,223,224],{},"Needed for messages from BitSong to Base Sepolia",[188,226,227,232,235,238],{},[209,228,229],{},[154,230,231],{},"hyperlane-validator-basesepolia",[209,233,234],{},"Base Sepolia",[209,236,237],{},"Base Sepolia Mailbox checkpoints",[209,239,240],{},"Needed for messages from Base Sepolia to BitSong",[121,242,243],{},"Each validator needs:",[245,246,247,254,261,264,267],"ul",{},[248,249,250,251],"li",{},"A secure checkpoint signing key in ",[125,252,253],{},"AWS KMS",[248,255,256,257,260],{},"A publicly readable ",[125,258,259],{},"S3 bucket"," for signed checkpoint files",[248,262,263],{},"Private, reliable RPC endpoints for the chain it validates",[248,265,266],{},"A persistent local database directory",[248,268,269],{},"Prometheus metrics enabled",[271,272,273],"note",{},"The same AWS KMS validator key can be used for both validator containers if the same EVM validator address is registered in both ISM configurations. Use separate S3 folders and separate database paths for each container.",[167,275,277],{"id":276},"production-checklist","Production Checklist",[121,279,280],{},"Before you start containers, confirm every item:",[245,282,283,286,289,292,295,298,301,304,307,310],{},[248,284,285],{},":checked-box: Your BitSong full node is synced, or you have private BitSong RPC and gRPC endpoints",[248,287,288],{},":checked-box: You have a private Base Sepolia RPC endpoint; do not depend on public RPCs in production",[248,290,291],{},":checked-box: The BitSong Hyperlane Mailbox, MerkleTreeHook, IGP, and ISM IDs are known",[248,293,294],{},":checked-box: The Base Sepolia Hyperlane contract addresses are known",[248,296,297],{},":checked-box: The validator EVM address from AWS KMS is registered in the relevant MultisigISM",[248,299,300],{},":checked-box: The AWS IAM user has permission to use the KMS key",[248,302,303],{},":checked-box: The S3 bucket is publicly readable and writable by the validator IAM user",[248,305,306],{},":checked-box: The Cosmos announcement signer account has TBTSG for BitSong gas",[248,308,309],{},":checked-box: The validator KMS address has Base Sepolia ETH for the Base Sepolia announcement transaction",[248,311,312],{},":checked-box: Metrics are scraped by Prometheus or your monitoring system",[167,314,316],{"id":315},"aws-server","AWS Server",[121,318,319],{},"Use one small EC2 instance per operator, or separate instances per region if you want high availability.",[182,321,322,332],{},[185,323,324],{},[188,325,326,329],{},[191,327,328],{},"Resource",[191,330,331],{},"Recommended minimum",[204,333,334,345,353,361,369],{},[188,335,336,339],{},[209,337,338],{},"Instance",[209,340,341,344],{},[154,342,343],{},"t3.small"," or better",[188,346,347,350],{},[209,348,349],{},"CPU",[209,351,352],{},"2 vCPU",[188,354,355,358],{},[209,356,357],{},"RAM",[209,359,360],{},"2 GB",[188,362,363,366],{},[209,364,365],{},"Disk",[209,367,368],{},"20 GB gp3",[188,370,371,374],{},[209,372,373],{},"OS",[209,375,376],{},"Ubuntu 22.04 LTS or 24.04 LTS",[121,378,379],{},"Security group rules:",[245,381,382,385,388,391],{},[248,383,384],{},"Allow SSH only from your operator IP",[248,386,387],{},"Do not expose Prometheus metrics publicly",[248,389,390],{},"Allow outbound HTTPS for AWS, RPC providers, and container image pulls",[248,392,393],{},"If the BitSong node is on the same server, bind RPC/gRPC locally where possible",[121,395,396],{},"Install required packages:",[398,399,405],"pre",{"className":400,"code":401,"filename":402,"language":403,"meta":404,"style":404},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt-get update\nsudo apt-get install -y ca-certificates curl gnupg jq awscli\n","Terminal","bash","",[154,406,407,423],{"__ignoreMap":404},[408,409,412,416,420],"span",{"class":410,"line":411},"line",1,[408,413,415],{"class":414},"sBMFI","sudo",[408,417,419],{"class":418},"sfazB"," apt-get",[408,421,422],{"class":418}," update\n",[408,424,426,428,430,433,436,439,442,445,448],{"class":410,"line":425},2,[408,427,415],{"class":414},[408,429,419],{"class":418},[408,431,432],{"class":418}," install",[408,434,435],{"class":418}," -y",[408,437,438],{"class":418}," ca-certificates",[408,440,441],{"class":418}," curl",[408,443,444],{"class":418}," gnupg",[408,446,447],{"class":418}," jq",[408,449,450],{"class":418}," awscli\n",[121,452,453,454,457],{},"Install Foundry for the ",[154,455,456],{},"cast"," command used to derive AWS KMS EVM addresses:",[398,459,461],{"className":400,"code":460,"filename":402,"language":403,"meta":404,"style":404},"curl -L https://foundry.paradigm.xyz | bash\nsource ~/.bashrc\nfoundryup\ncast --version\n",[154,462,463,481,490,496],{"__ignoreMap":404},[408,464,465,468,471,474,478],{"class":410,"line":411},[408,466,467],{"class":414},"curl",[408,469,470],{"class":418}," -L",[408,472,473],{"class":418}," https://foundry.paradigm.xyz",[408,475,477],{"class":476},"sMK4o"," |",[408,479,480],{"class":414}," bash\n",[408,482,483,487],{"class":410,"line":425},[408,484,486],{"class":485},"s2Zo4","source",[408,488,489],{"class":418}," ~/.bashrc\n",[408,491,493],{"class":410,"line":492},3,[408,494,495],{"class":414},"foundryup\n",[408,497,499,501],{"class":410,"line":498},4,[408,500,456],{"class":414},[408,502,503],{"class":418}," --version\n",[121,505,506],{},"Install Docker:",[398,508,510],{"className":400,"code":509,"filename":402,"language":403,"meta":404,"style":404},"sudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\n\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n\nsudo apt-get update\nsudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\nsudo usermod -aG docker $USER\n",[154,511,512,531,558,570,576,586,613,649,667,672,681,707],{"__ignoreMap":404},[408,513,514,516,518,521,525,528],{"class":410,"line":411},[408,515,415],{"class":414},[408,517,432],{"class":418},[408,519,520],{"class":418}," -m",[408,522,524],{"class":523},"sbssI"," 0755",[408,526,527],{"class":418}," -d",[408,529,530],{"class":418}," /etc/apt/keyrings\n",[408,532,533,535,538,541,543,546,549,552,555],{"class":410,"line":425},[408,534,467],{"class":414},[408,536,537],{"class":418}," -fsSL",[408,539,540],{"class":418}," https://download.docker.com/linux/ubuntu/gpg",[408,542,477],{"class":476},[408,544,545],{"class":414}," sudo",[408,547,548],{"class":418}," gpg",[408,550,551],{"class":418}," --dearmor",[408,553,554],{"class":418}," -o",[408,556,557],{"class":418}," /etc/apt/keyrings/docker.gpg\n",[408,559,560,562,565,568],{"class":410,"line":492},[408,561,415],{"class":414},[408,563,564],{"class":418}," chmod",[408,566,567],{"class":418}," a+r",[408,569,557],{"class":418},[408,571,572],{"class":410,"line":498},[408,573,575],{"emptyLinePlaceholder":574},true,"\n",[408,577,579,582],{"class":410,"line":578},5,[408,580,581],{"class":485},"echo",[408,583,585],{"class":584},"sTEyZ"," \\\n",[408,587,589,592,595,598,601,604,607,610],{"class":410,"line":588},6,[408,590,591],{"class":476},"  \"",[408,593,594],{"class":418},"deb [arch=",[408,596,597],{"class":476},"$(",[408,599,600],{"class":414},"dpkg",[408,602,603],{"class":418}," --print-architecture",[408,605,606],{"class":476},")",[408,608,609],{"class":418}," signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ",[408,611,612],{"class":584},"\\\n",[408,614,616,619,621,624,627,630,633,636,639,642,645,647],{"class":410,"line":615},7,[408,617,618],{"class":476},"  $(",[408,620,128],{"class":485},[408,622,623],{"class":418}," /etc/os-release ",[408,625,626],{"class":476},"&&",[408,628,629],{"class":485}," echo",[408,631,632],{"class":476}," \"",[408,634,635],{"class":584},"$VERSION_CODENAME",[408,637,638],{"class":476},"\")",[408,640,641],{"class":418}," stable",[408,643,644],{"class":476},"\"",[408,646,477],{"class":476},[408,648,585],{"class":584},[408,650,652,655,658,661,664],{"class":410,"line":651},8,[408,653,654],{"class":414},"  sudo",[408,656,657],{"class":418}," tee",[408,659,660],{"class":418}," /etc/apt/sources.list.d/docker.list",[408,662,663],{"class":476}," >",[408,665,666],{"class":418}," /dev/null\n",[408,668,670],{"class":410,"line":669},9,[408,671,575],{"emptyLinePlaceholder":574},[408,673,675,677,679],{"class":410,"line":674},10,[408,676,415],{"class":414},[408,678,419],{"class":418},[408,680,422],{"class":418},[408,682,684,686,688,690,692,695,698,701,704],{"class":410,"line":683},11,[408,685,415],{"class":414},[408,687,419],{"class":418},[408,689,432],{"class":418},[408,691,435],{"class":418},[408,693,694],{"class":418}," docker-ce",[408,696,697],{"class":418}," docker-ce-cli",[408,699,700],{"class":418}," containerd.io",[408,702,703],{"class":418}," docker-buildx-plugin",[408,705,706],{"class":418}," docker-compose-plugin\n",[408,708,710,712,715,718,721],{"class":410,"line":709},12,[408,711,415],{"class":414},[408,713,714],{"class":418}," usermod",[408,716,717],{"class":418}," -aG",[408,719,720],{"class":418}," docker",[408,722,723],{"class":584}," $USER\n",[121,725,726],{},"Log out and back in, then verify Docker:",[398,728,730],{"className":400,"code":729,"filename":402,"language":403,"meta":404,"style":404},"docker --version\ndocker run --rm hello-world\n",[154,731,732,739],{"__ignoreMap":404},[408,733,734,737],{"class":410,"line":411},[408,735,736],{"class":414},"docker",[408,738,503],{"class":418},[408,740,741,743,746,749],{"class":410,"line":425},[408,742,736],{"class":414},[408,744,745],{"class":418}," run",[408,747,748],{"class":418}," --rm",[408,750,751],{"class":418}," hello-world\n",[167,753,755],{"id":754},"aws-resources","AWS Resources",[757,758,760],"h3",{"id":759},"create-the-iam-user","Create the IAM User",[121,762,763],{},"Create an IAM user dedicated to the validator stack:",[398,765,771],{"className":766,"code":768,"filename":769,"language":770,"meta":404},[767],"language-text","hyperlane-validator-bitsong\n","IAM user name","text",[154,772,768],{"__ignoreMap":404},[121,774,775,776,779],{},"Create an access key for ",[125,777,778],{},"Application running outside AWS"," and save:",[245,781,782,787],{},[248,783,784],{},[154,785,786],{},"AWS_ACCESS_KEY_ID",[248,788,789],{},[154,790,791],{},"AWS_SECRET_ACCESS_KEY",[121,793,794],{},"On the server, export the AWS environment:",[398,796,798],{"className":400,"code":797,"filename":402,"language":403,"meta":404,"style":404},"export AWS_ACCESS_KEY_ID=\"\u003Cyour-access-key-id>\"\nexport AWS_SECRET_ACCESS_KEY=\"\u003Cyour-secret-access-key>\"\nexport AWS_REGION=\"us-east-1\"\n",[154,799,800,820,836],{"__ignoreMap":404},[408,801,802,806,809,812,814,817],{"class":410,"line":411},[408,803,805],{"class":804},"spNyl","export",[408,807,808],{"class":584}," AWS_ACCESS_KEY_ID",[408,810,811],{"class":476},"=",[408,813,644],{"class":476},[408,815,816],{"class":418},"\u003Cyour-access-key-id>",[408,818,819],{"class":476},"\"\n",[408,821,822,824,827,829,831,834],{"class":410,"line":425},[408,823,805],{"class":804},[408,825,826],{"class":584}," AWS_SECRET_ACCESS_KEY",[408,828,811],{"class":476},[408,830,644],{"class":476},[408,832,833],{"class":418},"\u003Cyour-secret-access-key>",[408,835,819],{"class":476},[408,837,838,840,843,845,847,850],{"class":410,"line":492},[408,839,805],{"class":804},[408,841,842],{"class":584}," AWS_REGION",[408,844,811],{"class":476},[408,846,644],{"class":476},[408,848,849],{"class":418},"us-east-1",[408,851,819],{"class":476},[853,854,855],"tip",{},"Use the same AWS region for KMS and S3 unless you have a specific operational reason to split them.",[757,857,859],{"id":858},"create-the-kms-validator-key","Create the KMS Validator Key",[121,861,862],{},"Create one customer-managed KMS key:",[182,864,865,875],{},[185,866,867],{},[188,868,869,872],{},[191,870,871],{},"Setting",[191,873,874],{},"Value",[204,876,877,885,893,903],{},[188,878,879,882],{},[209,880,881],{},"Key type",[209,883,884],{},"Asymmetric",[188,886,887,890],{},[209,888,889],{},"Key usage",[209,891,892],{},"Sign and verify",[188,894,895,898],{},[209,896,897],{},"Key spec",[209,899,900],{},[154,901,902],{},"ECC_SECG_P256K1",[188,904,905,908],{},[209,906,907],{},"Alias",[209,909,910],{},[154,911,912],{},"hyperlane-validator-signer-bitsong",[121,914,915,916,128],{},"Grant key usage permissions to the IAM user ",[154,917,213],{},[121,919,920],{},"Verify the validator EVM address:",[398,922,924],{"className":400,"code":923,"filename":402,"language":403,"meta":404,"style":404},"AWS_KMS_KEY_ID=alias/hyperlane-validator-signer-bitsong \\\ncast wallet address --aws\n",[154,925,926,938],{"__ignoreMap":404},[408,927,928,931,933,936],{"class":410,"line":411},[408,929,930],{"class":584},"AWS_KMS_KEY_ID",[408,932,811],{"class":476},[408,934,935],{"class":418},"alias/hyperlane-validator-signer-bitsong",[408,937,585],{"class":414},[408,939,940,943,946,949],{"class":410,"line":425},[408,941,942],{"class":584},"cast ",[408,944,945],{"class":418},"wallet",[408,947,948],{"class":418}," address",[408,950,951],{"class":418}," --aws\n",[121,953,954],{},"Save the result:",[398,956,958],{"className":400,"code":957,"filename":402,"language":403,"meta":404,"style":404},"export VALIDATOR_ADDR=\"0x\u003Ckms-derived-validator-address>\"\n",[154,959,960],{"__ignoreMap":404},[408,961,962,964,967,969,971,974],{"class":410,"line":411},[408,963,805],{"class":804},[408,965,966],{"class":584}," VALIDATOR_ADDR",[408,968,811],{"class":476},[408,970,644],{"class":476},[408,972,973],{"class":418},"0x\u003Ckms-derived-validator-address>",[408,975,819],{"class":476},[159,977,978],{},"Register this exact EVM address in the MultisigISM. If the ISM contains a placeholder or a different address, the bridge will not verify messages signed by your validator.",[757,980,982],{"id":981},"create-the-s3-checkpoint-bucket","Create the S3 Checkpoint Bucket",[121,984,985],{},"Create a bucket:",[398,987,990],{"className":988,"code":989,"filename":259,"language":770,"meta":404},[767],"hyperlane-validator-signatures-bitsong\n",[154,991,989],{"__ignoreMap":404},[121,993,994],{},"Use the same region as the KMS key. Keep ACLs disabled.",[121,996,997,998,1001],{},"In ",[125,999,1000],{},"Block Public Access settings",", use:",[245,1003,1004,1007,1010,1013,1016],{},[248,1005,1006],{},":unchecked-box: Block all public access",[248,1008,1009],{},":checked-box: Block public access through new ACLs",[248,1011,1012],{},":checked-box: Block public access through any ACLs",[248,1014,1015],{},":unchecked-box: Block public access through new public bucket policies",[248,1017,1018],{},":unchecked-box: Block public and cross-account access through any public bucket policies",[121,1020,1021,1022,1025,1026,180],{},"Add this bucket policy, replacing ",[154,1023,1024],{},"${BUCKET_ARN}"," and ",[154,1027,1028],{},"${USER_ARN}",[398,1030,1035],{"className":1031,"code":1032,"filename":1033,"language":1034,"meta":404,"style":404},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": \"*\",\n      \"Action\": [\n        \"s3:GetObject\",\n        \"s3:ListBucket\"\n      ],\n      \"Resource\": [\n        \"${BUCKET_ARN}\",\n        \"${BUCKET_ARN}/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"AWS\": \"${USER_ARN}\"\n      },\n      \"Action\": [\n        \"s3:DeleteObject\",\n        \"s3:PutObject\"\n      ],\n      \"Resource\": \"${BUCKET_ARN}/*\"\n    }\n  ]\n}\n","Bucket Policy","json",[154,1036,1037,1042,1063,1077,1082,1103,1123,1136,1148,1157,1162,1174,1184,1194,1200,1206,1211,1230,1244,1262,1268,1281,1293,1303,1308,1325,1331,1337],{"__ignoreMap":404},[408,1038,1039],{"class":410,"line":411},[408,1040,1041],{"class":476},"{\n",[408,1043,1044,1046,1049,1051,1053,1055,1058,1060],{"class":410,"line":425},[408,1045,591],{"class":476},[408,1047,1048],{"class":804},"Version",[408,1050,644],{"class":476},[408,1052,180],{"class":476},[408,1054,632],{"class":476},[408,1056,1057],{"class":418},"2012-10-17",[408,1059,644],{"class":476},[408,1061,1062],{"class":476},",\n",[408,1064,1065,1067,1070,1072,1074],{"class":410,"line":492},[408,1066,591],{"class":476},[408,1068,1069],{"class":804},"Statement",[408,1071,644],{"class":476},[408,1073,180],{"class":476},[408,1075,1076],{"class":476}," [\n",[408,1078,1079],{"class":410,"line":498},[408,1080,1081],{"class":476},"    {\n",[408,1083,1084,1087,1090,1092,1094,1096,1099,1101],{"class":410,"line":578},[408,1085,1086],{"class":476},"      \"",[408,1088,1089],{"class":414},"Effect",[408,1091,644],{"class":476},[408,1093,180],{"class":476},[408,1095,632],{"class":476},[408,1097,1098],{"class":418},"Allow",[408,1100,644],{"class":476},[408,1102,1062],{"class":476},[408,1104,1105,1107,1110,1112,1114,1116,1119,1121],{"class":410,"line":588},[408,1106,1086],{"class":476},[408,1108,1109],{"class":414},"Principal",[408,1111,644],{"class":476},[408,1113,180],{"class":476},[408,1115,632],{"class":476},[408,1117,1118],{"class":418},"*",[408,1120,644],{"class":476},[408,1122,1062],{"class":476},[408,1124,1125,1127,1130,1132,1134],{"class":410,"line":615},[408,1126,1086],{"class":476},[408,1128,1129],{"class":414},"Action",[408,1131,644],{"class":476},[408,1133,180],{"class":476},[408,1135,1076],{"class":476},[408,1137,1138,1141,1144,1146],{"class":410,"line":651},[408,1139,1140],{"class":476},"        \"",[408,1142,1143],{"class":418},"s3:GetObject",[408,1145,644],{"class":476},[408,1147,1062],{"class":476},[408,1149,1150,1152,1155],{"class":410,"line":669},[408,1151,1140],{"class":476},[408,1153,1154],{"class":418},"s3:ListBucket",[408,1156,819],{"class":476},[408,1158,1159],{"class":410,"line":674},[408,1160,1161],{"class":476},"      ],\n",[408,1163,1164,1166,1168,1170,1172],{"class":410,"line":683},[408,1165,1086],{"class":476},[408,1167,328],{"class":414},[408,1169,644],{"class":476},[408,1171,180],{"class":476},[408,1173,1076],{"class":476},[408,1175,1176,1178,1180,1182],{"class":410,"line":709},[408,1177,1140],{"class":476},[408,1179,1024],{"class":418},[408,1181,644],{"class":476},[408,1183,1062],{"class":476},[408,1185,1187,1189,1192],{"class":410,"line":1186},13,[408,1188,1140],{"class":476},[408,1190,1191],{"class":418},"${BUCKET_ARN}/*",[408,1193,819],{"class":476},[408,1195,1197],{"class":410,"line":1196},14,[408,1198,1199],{"class":476},"      ]\n",[408,1201,1203],{"class":410,"line":1202},15,[408,1204,1205],{"class":476},"    },\n",[408,1207,1209],{"class":410,"line":1208},16,[408,1210,1081],{"class":476},[408,1212,1214,1216,1218,1220,1222,1224,1226,1228],{"class":410,"line":1213},17,[408,1215,1086],{"class":476},[408,1217,1089],{"class":414},[408,1219,644],{"class":476},[408,1221,180],{"class":476},[408,1223,632],{"class":476},[408,1225,1098],{"class":418},[408,1227,644],{"class":476},[408,1229,1062],{"class":476},[408,1231,1233,1235,1237,1239,1241],{"class":410,"line":1232},18,[408,1234,1086],{"class":476},[408,1236,1109],{"class":414},[408,1238,644],{"class":476},[408,1240,180],{"class":476},[408,1242,1243],{"class":476}," {\n",[408,1245,1247,1249,1252,1254,1256,1258,1260],{"class":410,"line":1246},19,[408,1248,1140],{"class":476},[408,1250,1251],{"class":523},"AWS",[408,1253,644],{"class":476},[408,1255,180],{"class":476},[408,1257,632],{"class":476},[408,1259,1028],{"class":418},[408,1261,819],{"class":476},[408,1263,1265],{"class":410,"line":1264},20,[408,1266,1267],{"class":476},"      },\n",[408,1269,1271,1273,1275,1277,1279],{"class":410,"line":1270},21,[408,1272,1086],{"class":476},[408,1274,1129],{"class":414},[408,1276,644],{"class":476},[408,1278,180],{"class":476},[408,1280,1076],{"class":476},[408,1282,1284,1286,1289,1291],{"class":410,"line":1283},22,[408,1285,1140],{"class":476},[408,1287,1288],{"class":418},"s3:DeleteObject",[408,1290,644],{"class":476},[408,1292,1062],{"class":476},[408,1294,1296,1298,1301],{"class":410,"line":1295},23,[408,1297,1140],{"class":476},[408,1299,1300],{"class":418},"s3:PutObject",[408,1302,819],{"class":476},[408,1304,1306],{"class":410,"line":1305},24,[408,1307,1161],{"class":476},[408,1309,1311,1313,1315,1317,1319,1321,1323],{"class":410,"line":1310},25,[408,1312,1086],{"class":476},[408,1314,328],{"class":414},[408,1316,644],{"class":476},[408,1318,180],{"class":476},[408,1320,632],{"class":476},[408,1322,1191],{"class":418},[408,1324,819],{"class":476},[408,1326,1328],{"class":410,"line":1327},26,[408,1329,1330],{"class":476},"    }\n",[408,1332,1334],{"class":410,"line":1333},27,[408,1335,1336],{"class":476},"  ]\n",[408,1338,1340],{"class":410,"line":1339},28,[408,1341,1342],{"class":476},"}\n",[121,1344,1345],{},"Validate write access from the server:",[398,1347,1349],{"className":400,"code":1348,"filename":402,"language":403,"meta":404,"style":404},"aws s3 cp /etc/hostname s3://hyperlane-validator-signatures-bitsong/healthcheck.txt\naws s3 ls s3://hyperlane-validator-signatures-bitsong/\naws s3 rm s3://hyperlane-validator-signatures-bitsong/healthcheck.txt\n",[154,1350,1351,1368,1380],{"__ignoreMap":404},[408,1352,1353,1356,1359,1362,1365],{"class":410,"line":411},[408,1354,1355],{"class":414},"aws",[408,1357,1358],{"class":418}," s3",[408,1360,1361],{"class":418}," cp",[408,1363,1364],{"class":418}," /etc/hostname",[408,1366,1367],{"class":418}," s3://hyperlane-validator-signatures-bitsong/healthcheck.txt\n",[408,1369,1370,1372,1374,1377],{"class":410,"line":425},[408,1371,1355],{"class":414},[408,1373,1358],{"class":418},[408,1375,1376],{"class":418}," ls",[408,1378,1379],{"class":418}," s3://hyperlane-validator-signatures-bitsong/\n",[408,1381,1382,1384,1386,1389],{"class":410,"line":492},[408,1383,1355],{"class":414},[408,1385,1358],{"class":418},[408,1387,1388],{"class":418}," rm",[408,1390,1367],{"class":418},[167,1392,1394],{"id":1393},"cosmos-announcement-signer","Cosmos Announcement Signer",[121,1396,1397],{},"BitSong is a Cosmos chain. The validator checkpoint signature uses AWS KMS, but the BitSong announcement transaction still needs a Cosmos signer key.",[121,1399,1400],{},"Create a dedicated key:",[398,1402,1404],{"className":400,"code":1403,"filename":402,"language":403,"meta":404,"style":404},"bitsongd keys add hyperlane-signer --keyring-backend test\n",[154,1405,1406],{"__ignoreMap":404},[408,1407,1408,1411,1414,1417,1420,1423],{"class":410,"line":411},[408,1409,1410],{"class":414},"bitsongd",[408,1412,1413],{"class":418}," keys",[408,1415,1416],{"class":418}," add",[408,1418,1419],{"class":418}," hyperlane-signer",[408,1421,1422],{"class":418}," --keyring-backend",[408,1424,1425],{"class":418}," test\n",[121,1427,1428],{},"Export the private key as hex:",[398,1430,1432],{"className":400,"code":1431,"filename":402,"language":403,"meta":404,"style":404},"COSMOS_SIGNER_KEY=0x$(bitsongd keys export hyperlane-signer --unarmored-hex --unsafe --keyring-backend test 2>&1 | tail -1)\nexport COSMOS_SIGNER_KEY\n",[154,1433,1434,1480],{"__ignoreMap":404},[408,1435,1436,1439,1441,1444,1446,1448,1450,1453,1455,1458,1461,1463,1466,1469,1471,1474,1477],{"class":410,"line":411},[408,1437,1438],{"class":584},"COSMOS_SIGNER_KEY",[408,1440,811],{"class":476},[408,1442,1443],{"class":418},"0x",[408,1445,597],{"class":476},[408,1447,1410],{"class":414},[408,1449,1413],{"class":418},[408,1451,1452],{"class":418}," export",[408,1454,1419],{"class":418},[408,1456,1457],{"class":418}," --unarmored-hex",[408,1459,1460],{"class":418}," --unsafe",[408,1462,1422],{"class":418},[408,1464,1465],{"class":418}," test",[408,1467,1468],{"class":476}," 2>&1",[408,1470,477],{"class":476},[408,1472,1473],{"class":414}," tail",[408,1475,1476],{"class":418}," -1",[408,1478,1479],{"class":476},")\n",[408,1481,1482,1484],{"class":410,"line":425},[408,1483,805],{"class":804},[408,1485,1486],{"class":584}," COSMOS_SIGNER_KEY\n",[121,1488,1489],{},"Fund the signer with TBTSG:",[398,1491,1493],{"className":400,"code":1492,"filename":402,"language":403,"meta":404,"style":404},"bitsongd tx bank send \u003Cyour-funded-key> $(bitsongd keys show hyperlane-signer -a --keyring-backend test) 10000000utbtsg \\\n  --from \u003Cyour-funded-key> \\\n  --keyring-backend test \\\n  --chain-id crescendo-1 \\\n  --node tcp://localhost:26657 \\\n  --fees 10000utbtsg \\\n  -y\n",[154,1494,1495,1546,1561,1570,1580,1590,1600],{"__ignoreMap":404},[408,1496,1497,1499,1502,1505,1508,1511,1514,1517,1520,1523,1525,1527,1530,1532,1535,1537,1539,1541,1544],{"class":410,"line":411},[408,1498,1410],{"class":414},[408,1500,1501],{"class":418}," tx",[408,1503,1504],{"class":418}," bank",[408,1506,1507],{"class":418}," send",[408,1509,1510],{"class":476}," \u003C",[408,1512,1513],{"class":418},"your-funded-ke",[408,1515,1516],{"class":584},"y",[408,1518,1519],{"class":476},">",[408,1521,1522],{"class":476}," $(",[408,1524,1410],{"class":414},[408,1526,1413],{"class":418},[408,1528,1529],{"class":418}," show",[408,1531,1419],{"class":418},[408,1533,1534],{"class":418}," -a",[408,1536,1422],{"class":418},[408,1538,1465],{"class":418},[408,1540,606],{"class":476},[408,1542,1543],{"class":418}," 10000000utbtsg",[408,1545,585],{"class":584},[408,1547,1548,1551,1553,1555,1557,1559],{"class":410,"line":425},[408,1549,1550],{"class":418},"  --from",[408,1552,1510],{"class":476},[408,1554,1513],{"class":418},[408,1556,1516],{"class":584},[408,1558,1519],{"class":476},[408,1560,585],{"class":584},[408,1562,1563,1566,1568],{"class":410,"line":492},[408,1564,1565],{"class":418},"  --keyring-backend",[408,1567,1465],{"class":418},[408,1569,585],{"class":584},[408,1571,1572,1575,1578],{"class":410,"line":498},[408,1573,1574],{"class":418},"  --chain-id",[408,1576,1577],{"class":418}," crescendo-1",[408,1579,585],{"class":584},[408,1581,1582,1585,1588],{"class":410,"line":578},[408,1583,1584],{"class":418},"  --node",[408,1586,1587],{"class":418}," tcp://localhost:26657",[408,1589,585],{"class":584},[408,1591,1592,1595,1598],{"class":410,"line":588},[408,1593,1594],{"class":418},"  --fees",[408,1596,1597],{"class":418}," 10000utbtsg",[408,1599,585],{"class":584},[408,1601,1602],{"class":410,"line":615},[408,1603,1604],{"class":418},"  -y\n",[167,1606,1608],{"id":1607},"environment-file","Environment File",[121,1610,1611],{},"Create the production working directory:",[398,1613,1615],{"className":400,"code":1614,"filename":402,"language":403,"meta":404,"style":404},"mkdir -p $HOME/hyperlane-bitsong/{config,db}\n",[154,1616,1617],{"__ignoreMap":404},[408,1618,1619,1622,1625,1628],{"class":410,"line":411},[408,1620,1621],{"class":414},"mkdir",[408,1623,1624],{"class":418}," -p",[408,1626,1627],{"class":584}," $HOME",[408,1629,1630],{"class":418},"/hyperlane-bitsong/{config,db}\n",[121,1632,1633],{},"Create an environment file:",[398,1635,1638],{"className":400,"code":1636,"filename":1637,"language":403,"meta":404,"style":404},"AWS_ACCESS_KEY_ID=\u003Cyour-access-key-id>\nAWS_SECRET_ACCESS_KEY=\u003Cyour-secret-access-key>\nAWS_REGION=us-east-1\nCOSMOS_SIGNER_KEY=0x\u003Cyour-cosmos-signer-private-key>\nS3_BUCKET=hyperlane-validator-signatures-bitsong\nHYPERLANE_IMAGE=ghcr.io/hyperlane-xyz/hyperlane-agent:agents-v2.2.0\n","$HOME/hyperlane-bitsong/validator.env",[154,1639,1640,1653,1664,1674,1690,1699],{"__ignoreMap":404},[408,1641,1642,1644,1647,1650],{"class":410,"line":411},[408,1643,786],{"class":584},[408,1645,1646],{"class":476},"=\u003C",[408,1648,1649],{"class":418},"your-access-key-id",[408,1651,1652],{"class":476},">\n",[408,1654,1655,1657,1659,1662],{"class":410,"line":425},[408,1656,791],{"class":584},[408,1658,1646],{"class":476},[408,1660,1661],{"class":418},"your-secret-access-key",[408,1663,1652],{"class":476},[408,1665,1666,1669,1671],{"class":410,"line":492},[408,1667,1668],{"class":584},"AWS_REGION",[408,1670,811],{"class":476},[408,1672,1673],{"class":418},"us-east-1\n",[408,1675,1676,1678,1680,1682,1685,1688],{"class":410,"line":498},[408,1677,1438],{"class":584},[408,1679,811],{"class":476},[408,1681,1443],{"class":418},[408,1683,1684],{"class":476},"\u003C",[408,1686,1687],{"class":418},"your-cosmos-signer-private-key",[408,1689,1652],{"class":476},[408,1691,1692,1695,1697],{"class":410,"line":578},[408,1693,1694],{"class":584},"S3_BUCKET",[408,1696,811],{"class":476},[408,1698,989],{"class":418},[408,1700,1701,1704,1706],{"class":410,"line":588},[408,1702,1703],{"class":584},"HYPERLANE_IMAGE",[408,1705,811],{"class":476},[408,1707,1708],{"class":418},"ghcr.io/hyperlane-xyz/hyperlane-agent:agents-v2.2.0\n",[121,1710,1711],{},"Restrict access:",[398,1713,1715],{"className":400,"code":1714,"filename":402,"language":403,"meta":404,"style":404},"chmod 600 $HOME/hyperlane-bitsong/validator.env\n",[154,1716,1717],{"__ignoreMap":404},[408,1718,1719,1722,1725,1727],{"class":410,"line":411},[408,1720,1721],{"class":414},"chmod",[408,1723,1724],{"class":523}," 600",[408,1726,1627],{"class":584},[408,1728,1729],{"class":418},"/hyperlane-bitsong/validator.env\n",[121,1731,1732],{},"Pull the Hyperlane agent image:",[398,1734,1736],{"className":400,"code":1735,"filename":402,"language":403,"meta":404,"style":404},"source $HOME/hyperlane-bitsong/validator.env\ndocker pull --platform linux/amd64 $HYPERLANE_IMAGE\n",[154,1737,1738,1746],{"__ignoreMap":404},[408,1739,1740,1742,1744],{"class":410,"line":411},[408,1741,486],{"class":485},[408,1743,1627],{"class":584},[408,1745,1729],{"class":418},[408,1747,1748,1750,1753,1756,1759],{"class":410,"line":425},[408,1749,736],{"class":414},[408,1751,1752],{"class":418}," pull",[408,1754,1755],{"class":418}," --platform",[408,1757,1758],{"class":418}," linux/amd64",[408,1760,1761],{"class":584}," $HYPERLANE_IMAGE\n",[167,1763,1765],{"id":1764},"agent-configuration","Agent Configuration",[121,1767,1768],{},"Create the agent config:",[398,1770,1772],{"className":400,"code":1771,"filename":402,"language":403,"meta":404,"style":404},"nano $HOME/hyperlane-bitsong/config/agent-config.json\n",[154,1773,1774],{"__ignoreMap":404},[408,1775,1776,1779,1781],{"class":410,"line":411},[408,1777,1778],{"class":414},"nano",[408,1780,1627],{"class":584},[408,1782,1783],{"class":418},"/hyperlane-bitsong/config/agent-config.json\n",[121,1785,1786],{},"Use this template and replace the BitSong IDs with the values from the bridge deployment:",[398,1788,1791],{"className":1031,"code":1789,"filename":1790,"language":1034,"meta":404,"style":404},"{\n  \"chains\": {\n    \"bitsong\": {\n      \"name\": \"bitsong\",\n      \"chainId\": \"crescendo-1\",\n      \"domainId\": 7171,\n      \"protocol\": \"cosmosNative\",\n      \"bech32Prefix\": \"bitsong\",\n      \"slip44\": 639,\n      \"contractAddressBytes\": 32,\n      \"canonicalAsset\": \"utbtsg\",\n      \"rpcUrls\": [\n        { \"http\": \"http://127.0.0.1:26657\" }\n      ],\n      \"grpcUrls\": [\n        { \"http\": \"http://127.0.0.1:9090\" }\n      ],\n      \"nativeToken\": {\n        \"name\": \"BitSong\",\n        \"symbol\": \"BTSG\",\n        \"decimals\": 6,\n        \"denom\": \"utbtsg\"\n      },\n      \"gasPrice\": { \"amount\": \"0.025\", \"denom\": \"utbtsg\" },\n      \"gasMultiplier\": \"1.5\",\n      \"blocks\": {\n        \"confirmations\": 1,\n        \"estimateBlockTime\": 6,\n        \"reorgPeriod\": 1\n      },\n      \"index\": { \"from\": 1, \"chunk\": 50 },\n      \"mailbox\": \"\u003Cbitsong-mailbox-id>\",\n      \"validatorAnnounce\": \"\u003Cbitsong-mailbox-id>\",\n      \"merkleTreeHook\": \"\u003Cbitsong-merkle-tree-hook-id>\",\n      \"interchainGasPaymaster\": \"\u003Cbitsong-igp-id>\"\n    },\n    \"basesepolia\": {\n      \"name\": \"basesepolia\",\n      \"chainId\": 84532,\n      \"domainId\": 84532,\n      \"protocol\": \"ethereum\",\n      \"rpcUrls\": [\n        { \"http\": \"https://\u003Cyour-private-base-sepolia-rpc>\" }\n      ],\n      \"nativeToken\": {\n        \"name\": \"Ether\",\n        \"symbol\": \"ETH\",\n        \"decimals\": 18\n      },\n      \"blocks\": {\n        \"confirmations\": 1,\n        \"estimateBlockTime\": 2,\n        \"reorgPeriod\": 1\n      },\n      \"index\": { \"from\": 13850000, \"chunk\": 1999 },\n      \"mailbox\": \"0x6966b0E55883d49BFB24539356a2f8A673E02039\",\n      \"validatorAnnounce\": \"0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9\",\n      \"merkleTreeHook\": \"0x86fb9F1c124fB20ff130C41a79a432F770f67AFD\",\n      \"interchainGasPaymaster\": \"0x28B02B97a850872C4D33C3E024fab6499ad96564\"\n    }\n  }\n}\n","$HOME/hyperlane-bitsong/config/agent-config.json",[154,1792,1793,1797,1810,1824,1843,1862,1878,1898,1917,1933,1949,1969,1982,2007,2011,2024,2045,2049,2062,2081,2101,2117,2134,2138,2188,2208,2221,2237,2252,2267,2272,2313,2334,2354,2375,2394,2399,2413,2432,2448,2463,2483,2496,2518,2523,2536,2556,2576,2590,2595,2608,2623,2639,2652,2657,2696,2716,2736,2756,2774,2779,2785],{"__ignoreMap":404},[408,1794,1795],{"class":410,"line":411},[408,1796,1041],{"class":476},[408,1798,1799,1801,1804,1806,1808],{"class":410,"line":425},[408,1800,591],{"class":476},[408,1802,1803],{"class":804},"chains",[408,1805,644],{"class":476},[408,1807,180],{"class":476},[408,1809,1243],{"class":476},[408,1811,1812,1815,1818,1820,1822],{"class":410,"line":492},[408,1813,1814],{"class":476},"    \"",[408,1816,1817],{"class":414},"bitsong",[408,1819,644],{"class":476},[408,1821,180],{"class":476},[408,1823,1243],{"class":476},[408,1825,1826,1828,1831,1833,1835,1837,1839,1841],{"class":410,"line":498},[408,1827,1086],{"class":476},[408,1829,1830],{"class":523},"name",[408,1832,644],{"class":476},[408,1834,180],{"class":476},[408,1836,632],{"class":476},[408,1838,1817],{"class":418},[408,1840,644],{"class":476},[408,1842,1062],{"class":476},[408,1844,1845,1847,1850,1852,1854,1856,1858,1860],{"class":410,"line":578},[408,1846,1086],{"class":476},[408,1848,1849],{"class":523},"chainId",[408,1851,644],{"class":476},[408,1853,180],{"class":476},[408,1855,632],{"class":476},[408,1857,156],{"class":418},[408,1859,644],{"class":476},[408,1861,1062],{"class":476},[408,1863,1864,1866,1869,1871,1873,1876],{"class":410,"line":588},[408,1865,1086],{"class":476},[408,1867,1868],{"class":523},"domainId",[408,1870,644],{"class":476},[408,1872,180],{"class":476},[408,1874,1875],{"class":523}," 7171",[408,1877,1062],{"class":476},[408,1879,1880,1882,1885,1887,1889,1891,1894,1896],{"class":410,"line":615},[408,1881,1086],{"class":476},[408,1883,1884],{"class":523},"protocol",[408,1886,644],{"class":476},[408,1888,180],{"class":476},[408,1890,632],{"class":476},[408,1892,1893],{"class":418},"cosmosNative",[408,1895,644],{"class":476},[408,1897,1062],{"class":476},[408,1899,1900,1902,1905,1907,1909,1911,1913,1915],{"class":410,"line":651},[408,1901,1086],{"class":476},[408,1903,1904],{"class":523},"bech32Prefix",[408,1906,644],{"class":476},[408,1908,180],{"class":476},[408,1910,632],{"class":476},[408,1912,1817],{"class":418},[408,1914,644],{"class":476},[408,1916,1062],{"class":476},[408,1918,1919,1921,1924,1926,1928,1931],{"class":410,"line":669},[408,1920,1086],{"class":476},[408,1922,1923],{"class":523},"slip44",[408,1925,644],{"class":476},[408,1927,180],{"class":476},[408,1929,1930],{"class":523}," 639",[408,1932,1062],{"class":476},[408,1934,1935,1937,1940,1942,1944,1947],{"class":410,"line":674},[408,1936,1086],{"class":476},[408,1938,1939],{"class":523},"contractAddressBytes",[408,1941,644],{"class":476},[408,1943,180],{"class":476},[408,1945,1946],{"class":523}," 32",[408,1948,1062],{"class":476},[408,1950,1951,1953,1956,1958,1960,1962,1965,1967],{"class":410,"line":683},[408,1952,1086],{"class":476},[408,1954,1955],{"class":523},"canonicalAsset",[408,1957,644],{"class":476},[408,1959,180],{"class":476},[408,1961,632],{"class":476},[408,1963,1964],{"class":418},"utbtsg",[408,1966,644],{"class":476},[408,1968,1062],{"class":476},[408,1970,1971,1973,1976,1978,1980],{"class":410,"line":709},[408,1972,1086],{"class":476},[408,1974,1975],{"class":523},"rpcUrls",[408,1977,644],{"class":476},[408,1979,180],{"class":476},[408,1981,1076],{"class":476},[408,1983,1984,1987,1989,1993,1995,1997,1999,2002,2004],{"class":410,"line":1186},[408,1985,1986],{"class":476},"        {",[408,1988,632],{"class":476},[408,1990,1992],{"class":1991},"swJcz","http",[408,1994,644],{"class":476},[408,1996,180],{"class":476},[408,1998,632],{"class":476},[408,2000,2001],{"class":418},"http://127.0.0.1:26657",[408,2003,644],{"class":476},[408,2005,2006],{"class":476}," }\n",[408,2008,2009],{"class":410,"line":1196},[408,2010,1161],{"class":476},[408,2012,2013,2015,2018,2020,2022],{"class":410,"line":1202},[408,2014,1086],{"class":476},[408,2016,2017],{"class":523},"grpcUrls",[408,2019,644],{"class":476},[408,2021,180],{"class":476},[408,2023,1076],{"class":476},[408,2025,2026,2028,2030,2032,2034,2036,2038,2041,2043],{"class":410,"line":1208},[408,2027,1986],{"class":476},[408,2029,632],{"class":476},[408,2031,1992],{"class":1991},[408,2033,644],{"class":476},[408,2035,180],{"class":476},[408,2037,632],{"class":476},[408,2039,2040],{"class":418},"http://127.0.0.1:9090",[408,2042,644],{"class":476},[408,2044,2006],{"class":476},[408,2046,2047],{"class":410,"line":1213},[408,2048,1161],{"class":476},[408,2050,2051,2053,2056,2058,2060],{"class":410,"line":1232},[408,2052,1086],{"class":476},[408,2054,2055],{"class":523},"nativeToken",[408,2057,644],{"class":476},[408,2059,180],{"class":476},[408,2061,1243],{"class":476},[408,2063,2064,2066,2068,2070,2072,2074,2077,2079],{"class":410,"line":1246},[408,2065,1140],{"class":476},[408,2067,1830],{"class":1991},[408,2069,644],{"class":476},[408,2071,180],{"class":476},[408,2073,632],{"class":476},[408,2075,2076],{"class":418},"BitSong",[408,2078,644],{"class":476},[408,2080,1062],{"class":476},[408,2082,2083,2085,2088,2090,2092,2094,2097,2099],{"class":410,"line":1264},[408,2084,1140],{"class":476},[408,2086,2087],{"class":1991},"symbol",[408,2089,644],{"class":476},[408,2091,180],{"class":476},[408,2093,632],{"class":476},[408,2095,2096],{"class":418},"BTSG",[408,2098,644],{"class":476},[408,2100,1062],{"class":476},[408,2102,2103,2105,2108,2110,2112,2115],{"class":410,"line":1270},[408,2104,1140],{"class":476},[408,2106,2107],{"class":1991},"decimals",[408,2109,644],{"class":476},[408,2111,180],{"class":476},[408,2113,2114],{"class":523}," 6",[408,2116,1062],{"class":476},[408,2118,2119,2121,2124,2126,2128,2130,2132],{"class":410,"line":1283},[408,2120,1140],{"class":476},[408,2122,2123],{"class":1991},"denom",[408,2125,644],{"class":476},[408,2127,180],{"class":476},[408,2129,632],{"class":476},[408,2131,1964],{"class":418},[408,2133,819],{"class":476},[408,2135,2136],{"class":410,"line":1295},[408,2137,1267],{"class":476},[408,2139,2140,2142,2145,2147,2149,2152,2154,2157,2159,2161,2163,2166,2168,2171,2173,2175,2177,2179,2181,2183,2185],{"class":410,"line":1305},[408,2141,1086],{"class":476},[408,2143,2144],{"class":523},"gasPrice",[408,2146,644],{"class":476},[408,2148,180],{"class":476},[408,2150,2151],{"class":476}," {",[408,2153,632],{"class":476},[408,2155,2156],{"class":1991},"amount",[408,2158,644],{"class":476},[408,2160,180],{"class":476},[408,2162,632],{"class":476},[408,2164,2165],{"class":418},"0.025",[408,2167,644],{"class":476},[408,2169,2170],{"class":476},",",[408,2172,632],{"class":476},[408,2174,2123],{"class":1991},[408,2176,644],{"class":476},[408,2178,180],{"class":476},[408,2180,632],{"class":476},[408,2182,1964],{"class":418},[408,2184,644],{"class":476},[408,2186,2187],{"class":476}," },\n",[408,2189,2190,2192,2195,2197,2199,2201,2204,2206],{"class":410,"line":1310},[408,2191,1086],{"class":476},[408,2193,2194],{"class":523},"gasMultiplier",[408,2196,644],{"class":476},[408,2198,180],{"class":476},[408,2200,632],{"class":476},[408,2202,2203],{"class":418},"1.5",[408,2205,644],{"class":476},[408,2207,1062],{"class":476},[408,2209,2210,2212,2215,2217,2219],{"class":410,"line":1327},[408,2211,1086],{"class":476},[408,2213,2214],{"class":523},"blocks",[408,2216,644],{"class":476},[408,2218,180],{"class":476},[408,2220,1243],{"class":476},[408,2222,2223,2225,2228,2230,2232,2235],{"class":410,"line":1333},[408,2224,1140],{"class":476},[408,2226,2227],{"class":1991},"confirmations",[408,2229,644],{"class":476},[408,2231,180],{"class":476},[408,2233,2234],{"class":523}," 1",[408,2236,1062],{"class":476},[408,2238,2239,2241,2244,2246,2248,2250],{"class":410,"line":1339},[408,2240,1140],{"class":476},[408,2242,2243],{"class":1991},"estimateBlockTime",[408,2245,644],{"class":476},[408,2247,180],{"class":476},[408,2249,2114],{"class":523},[408,2251,1062],{"class":476},[408,2253,2255,2257,2260,2262,2264],{"class":410,"line":2254},29,[408,2256,1140],{"class":476},[408,2258,2259],{"class":1991},"reorgPeriod",[408,2261,644],{"class":476},[408,2263,180],{"class":476},[408,2265,2266],{"class":523}," 1\n",[408,2268,2270],{"class":410,"line":2269},30,[408,2271,1267],{"class":476},[408,2273,2275,2277,2280,2282,2284,2286,2288,2291,2293,2295,2297,2299,2301,2304,2306,2308,2311],{"class":410,"line":2274},31,[408,2276,1086],{"class":476},[408,2278,2279],{"class":523},"index",[408,2281,644],{"class":476},[408,2283,180],{"class":476},[408,2285,2151],{"class":476},[408,2287,632],{"class":476},[408,2289,2290],{"class":1991},"from",[408,2292,644],{"class":476},[408,2294,180],{"class":476},[408,2296,2234],{"class":523},[408,2298,2170],{"class":476},[408,2300,632],{"class":476},[408,2302,2303],{"class":1991},"chunk",[408,2305,644],{"class":476},[408,2307,180],{"class":476},[408,2309,2310],{"class":523}," 50",[408,2312,2187],{"class":476},[408,2314,2316,2318,2321,2323,2325,2327,2330,2332],{"class":410,"line":2315},32,[408,2317,1086],{"class":476},[408,2319,2320],{"class":523},"mailbox",[408,2322,644],{"class":476},[408,2324,180],{"class":476},[408,2326,632],{"class":476},[408,2328,2329],{"class":418},"\u003Cbitsong-mailbox-id>",[408,2331,644],{"class":476},[408,2333,1062],{"class":476},[408,2335,2337,2339,2342,2344,2346,2348,2350,2352],{"class":410,"line":2336},33,[408,2338,1086],{"class":476},[408,2340,2341],{"class":523},"validatorAnnounce",[408,2343,644],{"class":476},[408,2345,180],{"class":476},[408,2347,632],{"class":476},[408,2349,2329],{"class":418},[408,2351,644],{"class":476},[408,2353,1062],{"class":476},[408,2355,2357,2359,2362,2364,2366,2368,2371,2373],{"class":410,"line":2356},34,[408,2358,1086],{"class":476},[408,2360,2361],{"class":523},"merkleTreeHook",[408,2363,644],{"class":476},[408,2365,180],{"class":476},[408,2367,632],{"class":476},[408,2369,2370],{"class":418},"\u003Cbitsong-merkle-tree-hook-id>",[408,2372,644],{"class":476},[408,2374,1062],{"class":476},[408,2376,2378,2380,2383,2385,2387,2389,2392],{"class":410,"line":2377},35,[408,2379,1086],{"class":476},[408,2381,2382],{"class":523},"interchainGasPaymaster",[408,2384,644],{"class":476},[408,2386,180],{"class":476},[408,2388,632],{"class":476},[408,2390,2391],{"class":418},"\u003Cbitsong-igp-id>",[408,2393,819],{"class":476},[408,2395,2397],{"class":410,"line":2396},36,[408,2398,1205],{"class":476},[408,2400,2402,2404,2407,2409,2411],{"class":410,"line":2401},37,[408,2403,1814],{"class":476},[408,2405,2406],{"class":414},"basesepolia",[408,2408,644],{"class":476},[408,2410,180],{"class":476},[408,2412,1243],{"class":476},[408,2414,2416,2418,2420,2422,2424,2426,2428,2430],{"class":410,"line":2415},38,[408,2417,1086],{"class":476},[408,2419,1830],{"class":523},[408,2421,644],{"class":476},[408,2423,180],{"class":476},[408,2425,632],{"class":476},[408,2427,2406],{"class":418},[408,2429,644],{"class":476},[408,2431,1062],{"class":476},[408,2433,2435,2437,2439,2441,2443,2446],{"class":410,"line":2434},39,[408,2436,1086],{"class":476},[408,2438,1849],{"class":523},[408,2440,644],{"class":476},[408,2442,180],{"class":476},[408,2444,2445],{"class":523}," 84532",[408,2447,1062],{"class":476},[408,2449,2451,2453,2455,2457,2459,2461],{"class":410,"line":2450},40,[408,2452,1086],{"class":476},[408,2454,1868],{"class":523},[408,2456,644],{"class":476},[408,2458,180],{"class":476},[408,2460,2445],{"class":523},[408,2462,1062],{"class":476},[408,2464,2466,2468,2470,2472,2474,2476,2479,2481],{"class":410,"line":2465},41,[408,2467,1086],{"class":476},[408,2469,1884],{"class":523},[408,2471,644],{"class":476},[408,2473,180],{"class":476},[408,2475,632],{"class":476},[408,2477,2478],{"class":418},"ethereum",[408,2480,644],{"class":476},[408,2482,1062],{"class":476},[408,2484,2486,2488,2490,2492,2494],{"class":410,"line":2485},42,[408,2487,1086],{"class":476},[408,2489,1975],{"class":523},[408,2491,644],{"class":476},[408,2493,180],{"class":476},[408,2495,1076],{"class":476},[408,2497,2499,2501,2503,2505,2507,2509,2511,2514,2516],{"class":410,"line":2498},43,[408,2500,1986],{"class":476},[408,2502,632],{"class":476},[408,2504,1992],{"class":1991},[408,2506,644],{"class":476},[408,2508,180],{"class":476},[408,2510,632],{"class":476},[408,2512,2513],{"class":418},"https://\u003Cyour-private-base-sepolia-rpc>",[408,2515,644],{"class":476},[408,2517,2006],{"class":476},[408,2519,2521],{"class":410,"line":2520},44,[408,2522,1161],{"class":476},[408,2524,2526,2528,2530,2532,2534],{"class":410,"line":2525},45,[408,2527,1086],{"class":476},[408,2529,2055],{"class":523},[408,2531,644],{"class":476},[408,2533,180],{"class":476},[408,2535,1243],{"class":476},[408,2537,2539,2541,2543,2545,2547,2549,2552,2554],{"class":410,"line":2538},46,[408,2540,1140],{"class":476},[408,2542,1830],{"class":1991},[408,2544,644],{"class":476},[408,2546,180],{"class":476},[408,2548,632],{"class":476},[408,2550,2551],{"class":418},"Ether",[408,2553,644],{"class":476},[408,2555,1062],{"class":476},[408,2557,2559,2561,2563,2565,2567,2569,2572,2574],{"class":410,"line":2558},47,[408,2560,1140],{"class":476},[408,2562,2087],{"class":1991},[408,2564,644],{"class":476},[408,2566,180],{"class":476},[408,2568,632],{"class":476},[408,2570,2571],{"class":418},"ETH",[408,2573,644],{"class":476},[408,2575,1062],{"class":476},[408,2577,2579,2581,2583,2585,2587],{"class":410,"line":2578},48,[408,2580,1140],{"class":476},[408,2582,2107],{"class":1991},[408,2584,644],{"class":476},[408,2586,180],{"class":476},[408,2588,2589],{"class":523}," 18\n",[408,2591,2593],{"class":410,"line":2592},49,[408,2594,1267],{"class":476},[408,2596,2598,2600,2602,2604,2606],{"class":410,"line":2597},50,[408,2599,1086],{"class":476},[408,2601,2214],{"class":523},[408,2603,644],{"class":476},[408,2605,180],{"class":476},[408,2607,1243],{"class":476},[408,2609,2611,2613,2615,2617,2619,2621],{"class":410,"line":2610},51,[408,2612,1140],{"class":476},[408,2614,2227],{"class":1991},[408,2616,644],{"class":476},[408,2618,180],{"class":476},[408,2620,2234],{"class":523},[408,2622,1062],{"class":476},[408,2624,2626,2628,2630,2632,2634,2637],{"class":410,"line":2625},52,[408,2627,1140],{"class":476},[408,2629,2243],{"class":1991},[408,2631,644],{"class":476},[408,2633,180],{"class":476},[408,2635,2636],{"class":523}," 2",[408,2638,1062],{"class":476},[408,2640,2642,2644,2646,2648,2650],{"class":410,"line":2641},53,[408,2643,1140],{"class":476},[408,2645,2259],{"class":1991},[408,2647,644],{"class":476},[408,2649,180],{"class":476},[408,2651,2266],{"class":523},[408,2653,2655],{"class":410,"line":2654},54,[408,2656,1267],{"class":476},[408,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678,2681,2683,2685,2687,2689,2691,2694],{"class":410,"line":2659},55,[408,2661,1086],{"class":476},[408,2663,2279],{"class":523},[408,2665,644],{"class":476},[408,2667,180],{"class":476},[408,2669,2151],{"class":476},[408,2671,632],{"class":476},[408,2673,2290],{"class":1991},[408,2675,644],{"class":476},[408,2677,180],{"class":476},[408,2679,2680],{"class":523}," 13850000",[408,2682,2170],{"class":476},[408,2684,632],{"class":476},[408,2686,2303],{"class":1991},[408,2688,644],{"class":476},[408,2690,180],{"class":476},[408,2692,2693],{"class":523}," 1999",[408,2695,2187],{"class":476},[408,2697,2699,2701,2703,2705,2707,2709,2712,2714],{"class":410,"line":2698},56,[408,2700,1086],{"class":476},[408,2702,2320],{"class":523},[408,2704,644],{"class":476},[408,2706,180],{"class":476},[408,2708,632],{"class":476},[408,2710,2711],{"class":418},"0x6966b0E55883d49BFB24539356a2f8A673E02039",[408,2713,644],{"class":476},[408,2715,1062],{"class":476},[408,2717,2719,2721,2723,2725,2727,2729,2732,2734],{"class":410,"line":2718},57,[408,2720,1086],{"class":476},[408,2722,2341],{"class":523},[408,2724,644],{"class":476},[408,2726,180],{"class":476},[408,2728,632],{"class":476},[408,2730,2731],{"class":418},"0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9",[408,2733,644],{"class":476},[408,2735,1062],{"class":476},[408,2737,2739,2741,2743,2745,2747,2749,2752,2754],{"class":410,"line":2738},58,[408,2740,1086],{"class":476},[408,2742,2361],{"class":523},[408,2744,644],{"class":476},[408,2746,180],{"class":476},[408,2748,632],{"class":476},[408,2750,2751],{"class":418},"0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",[408,2753,644],{"class":476},[408,2755,1062],{"class":476},[408,2757,2759,2761,2763,2765,2767,2769,2772],{"class":410,"line":2758},59,[408,2760,1086],{"class":476},[408,2762,2382],{"class":523},[408,2764,644],{"class":476},[408,2766,180],{"class":476},[408,2768,632],{"class":476},[408,2770,2771],{"class":418},"0x28B02B97a850872C4D33C3E024fab6499ad96564",[408,2773,819],{"class":476},[408,2775,2777],{"class":410,"line":2776},60,[408,2778,1330],{"class":476},[408,2780,2782],{"class":410,"line":2781},61,[408,2783,2784],{"class":476},"  }\n",[408,2786,2788],{"class":410,"line":2787},62,[408,2789,1342],{"class":476},[271,2791,2792],{},"For Cosmos chains, configure both RPC and gRPC endpoints. For production, point these to your own BitSong node or a private provider. Public RPCs are not production infrastructure.",[121,2794,2795],{},"If you need to recover the BitSong IDs:",[398,2797,2799],{"className":400,"code":2798,"filename":402,"language":403,"meta":404,"style":404},"bitsongd query hyperlane mailboxes --output json --node tcp://localhost:26657 | jq '.mailboxes'\nbitsongd query hyperlane hooks merkle-tree-hooks --output json --node tcp://localhost:26657 | jq '.merkle_tree_hooks'\nbitsongd query hyperlane hooks igps --output json --node tcp://localhost:26657 | jq '.igps'\n",[154,2800,2801,2838,2871],{"__ignoreMap":404},[408,2802,2803,2805,2808,2811,2814,2817,2820,2823,2825,2827,2829,2832,2835],{"class":410,"line":411},[408,2804,1410],{"class":414},[408,2806,2807],{"class":418}," query",[408,2809,2810],{"class":418}," hyperlane",[408,2812,2813],{"class":418}," mailboxes",[408,2815,2816],{"class":418}," --output",[408,2818,2819],{"class":418}," json",[408,2821,2822],{"class":418}," --node",[408,2824,1587],{"class":418},[408,2826,477],{"class":476},[408,2828,447],{"class":414},[408,2830,2831],{"class":476}," '",[408,2833,2834],{"class":418},".mailboxes",[408,2836,2837],{"class":476},"'\n",[408,2839,2840,2842,2844,2846,2849,2852,2854,2856,2858,2860,2862,2864,2866,2869],{"class":410,"line":425},[408,2841,1410],{"class":414},[408,2843,2807],{"class":418},[408,2845,2810],{"class":418},[408,2847,2848],{"class":418}," hooks",[408,2850,2851],{"class":418}," merkle-tree-hooks",[408,2853,2816],{"class":418},[408,2855,2819],{"class":418},[408,2857,2822],{"class":418},[408,2859,1587],{"class":418},[408,2861,477],{"class":476},[408,2863,447],{"class":414},[408,2865,2831],{"class":476},[408,2867,2868],{"class":418},".merkle_tree_hooks",[408,2870,2837],{"class":476},[408,2872,2873,2875,2877,2879,2881,2884,2886,2888,2890,2892,2894,2896,2898,2901],{"class":410,"line":492},[408,2874,1410],{"class":414},[408,2876,2807],{"class":418},[408,2878,2810],{"class":418},[408,2880,2848],{"class":418},[408,2882,2883],{"class":418}," igps",[408,2885,2816],{"class":418},[408,2887,2819],{"class":418},[408,2889,2822],{"class":418},[408,2891,1587],{"class":418},[408,2893,477],{"class":476},[408,2895,447],{"class":414},[408,2897,2831],{"class":476},[408,2899,2900],{"class":418},".igps",[408,2902,2837],{"class":476},[121,2904,2905],{},"Validate the JSON:",[398,2907,2909],{"className":400,"code":2908,"filename":402,"language":403,"meta":404,"style":404},"jq . $HOME/hyperlane-bitsong/config/agent-config.json > /dev/null\n",[154,2910,2911],{"__ignoreMap":404},[408,2912,2913,2916,2919,2921,2924,2926],{"class":410,"line":411},[408,2914,2915],{"class":414},"jq",[408,2917,2918],{"class":418}," .",[408,2920,1627],{"class":584},[408,2922,2923],{"class":418},"/hyperlane-bitsong/config/agent-config.json",[408,2925,663],{"class":476},[408,2927,666],{"class":418},[167,2929,2931],{"id":2930},"start-validators","Start Validators",[121,2933,2934],{},"Create persistent database directories:",[398,2936,2938],{"className":400,"code":2937,"filename":402,"language":403,"meta":404,"style":404},"mkdir -p $HOME/hyperlane-bitsong/db/validator-bitsong\nmkdir -p $HOME/hyperlane-bitsong/db/validator-basesepolia\n",[154,2939,2940,2951],{"__ignoreMap":404},[408,2941,2942,2944,2946,2948],{"class":410,"line":411},[408,2943,1621],{"class":414},[408,2945,1624],{"class":418},[408,2947,1627],{"class":584},[408,2949,2950],{"class":418},"/hyperlane-bitsong/db/validator-bitsong\n",[408,2952,2953,2955,2957,2959],{"class":410,"line":425},[408,2954,1621],{"class":414},[408,2956,1624],{"class":418},[408,2958,1627],{"class":584},[408,2960,2961],{"class":418},"/hyperlane-bitsong/db/validator-basesepolia\n",[757,2963,2965],{"id":2964},"bitsong-validator","BitSong Validator",[121,2967,2968],{},"This validator watches BitSong and writes BitSong checkpoint signatures to S3.",[398,2970,2972],{"className":400,"code":2971,"filename":402,"language":403,"meta":404,"style":404},"source $HOME/hyperlane-bitsong/validator.env\n\ndocker run -d \\\n  --name hyperlane-validator-bitsong \\\n  --restart unless-stopped \\\n  --network host \\\n  --user $(id -u):$(id -g) \\\n  --env-file $HOME/hyperlane-bitsong/validator.env \\\n  -e CONFIG_FILES=/config/agent-config.json \\\n  -v $HOME/hyperlane-bitsong/config/agent-config.json:/config/agent-config.json:ro \\\n  -v $HOME/hyperlane-bitsong/db/validator-bitsong:/hyperlane_db \\\n  --log-driver json-file \\\n  --log-opt max-size=50m \\\n  --log-opt max-file=5 \\\n  $HYPERLANE_IMAGE \\\n  ./validator \\\n  --db /hyperlane_db \\\n  --originChainName bitsong \\\n  --reorgPeriod 1 \\\n  --interval 10 \\\n  --validator.type aws \\\n  --validator.region $AWS_REGION \\\n  --validator.id alias/hyperlane-validator-signer-bitsong \\\n  --chains.bitsong.signer.type cosmosKey \\\n  --chains.bitsong.signer.key $COSMOS_SIGNER_KEY \\\n  --chains.bitsong.signer.prefix bitsong \\\n  --checkpointSyncer.type s3 \\\n  --checkpointSyncer.bucket $S3_BUCKET \\\n  --checkpointSyncer.region $AWS_REGION \\\n  --checkpointSyncer.folder bitsong \\\n  --metrics-port 9090 \\\n  --log.format json \\\n  --log.level info\n",[154,2973,2974,2982,2986,2996,3006,3016,3026,3054,3066,3076,3088,3099,3109,3119,3131,3136,3143,3153,3163,3172,3182,3192,3200,3210,3220,3228,3237,3246,3254,3261,3270,3280,3289],{"__ignoreMap":404},[408,2975,2976,2978,2980],{"class":410,"line":411},[408,2977,486],{"class":485},[408,2979,1627],{"class":584},[408,2981,1729],{"class":418},[408,2983,2984],{"class":410,"line":425},[408,2985,575],{"emptyLinePlaceholder":574},[408,2987,2988,2990,2992,2994],{"class":410,"line":492},[408,2989,736],{"class":414},[408,2991,745],{"class":418},[408,2993,527],{"class":418},[408,2995,585],{"class":584},[408,2997,2998,3001,3004],{"class":410,"line":498},[408,2999,3000],{"class":418},"  --name",[408,3002,3003],{"class":418}," hyperlane-validator-bitsong",[408,3005,585],{"class":584},[408,3007,3008,3011,3014],{"class":410,"line":578},[408,3009,3010],{"class":418},"  --restart",[408,3012,3013],{"class":418}," unless-stopped",[408,3015,585],{"class":584},[408,3017,3018,3021,3024],{"class":410,"line":588},[408,3019,3020],{"class":418},"  --network",[408,3022,3023],{"class":418}," host",[408,3025,585],{"class":584},[408,3027,3028,3031,3033,3036,3039,3041,3043,3045,3047,3050,3052],{"class":410,"line":615},[408,3029,3030],{"class":418},"  --user",[408,3032,1522],{"class":476},[408,3034,3035],{"class":414},"id",[408,3037,3038],{"class":418}," -u",[408,3040,606],{"class":476},[408,3042,180],{"class":418},[408,3044,597],{"class":476},[408,3046,3035],{"class":414},[408,3048,3049],{"class":418}," -g",[408,3051,606],{"class":476},[408,3053,585],{"class":584},[408,3055,3056,3059,3061,3064],{"class":410,"line":651},[408,3057,3058],{"class":418},"  --env-file",[408,3060,1627],{"class":584},[408,3062,3063],{"class":418},"/hyperlane-bitsong/validator.env",[408,3065,585],{"class":584},[408,3067,3068,3071,3074],{"class":410,"line":669},[408,3069,3070],{"class":418},"  -e",[408,3072,3073],{"class":418}," CONFIG_FILES=/config/agent-config.json",[408,3075,585],{"class":584},[408,3077,3078,3081,3083,3086],{"class":410,"line":674},[408,3079,3080],{"class":418},"  -v",[408,3082,1627],{"class":584},[408,3084,3085],{"class":418},"/hyperlane-bitsong/config/agent-config.json:/config/agent-config.json:ro",[408,3087,585],{"class":584},[408,3089,3090,3092,3094,3097],{"class":410,"line":683},[408,3091,3080],{"class":418},[408,3093,1627],{"class":584},[408,3095,3096],{"class":418},"/hyperlane-bitsong/db/validator-bitsong:/hyperlane_db",[408,3098,585],{"class":584},[408,3100,3101,3104,3107],{"class":410,"line":709},[408,3102,3103],{"class":418},"  --log-driver",[408,3105,3106],{"class":418}," json-file",[408,3108,585],{"class":584},[408,3110,3111,3114,3117],{"class":410,"line":1186},[408,3112,3113],{"class":418},"  --log-opt",[408,3115,3116],{"class":418}," max-size=50m",[408,3118,585],{"class":584},[408,3120,3121,3123,3126,3129],{"class":410,"line":1196},[408,3122,3113],{"class":418},[408,3124,3125],{"class":418}," max-file=",[408,3127,3128],{"class":523},"5",[408,3130,585],{"class":584},[408,3132,3133],{"class":410,"line":1202},[408,3134,3135],{"class":584},"  $HYPERLANE_IMAGE \\\n",[408,3137,3138,3141],{"class":410,"line":1208},[408,3139,3140],{"class":418},"  ./validator",[408,3142,585],{"class":584},[408,3144,3145,3148,3151],{"class":410,"line":1213},[408,3146,3147],{"class":418},"  --db",[408,3149,3150],{"class":418}," /hyperlane_db",[408,3152,585],{"class":584},[408,3154,3155,3158,3161],{"class":410,"line":1232},[408,3156,3157],{"class":418},"  --originChainName",[408,3159,3160],{"class":418}," bitsong",[408,3162,585],{"class":584},[408,3164,3165,3168,3170],{"class":410,"line":1246},[408,3166,3167],{"class":418},"  --reorgPeriod",[408,3169,2234],{"class":523},[408,3171,585],{"class":584},[408,3173,3174,3177,3180],{"class":410,"line":1264},[408,3175,3176],{"class":418},"  --interval",[408,3178,3179],{"class":523}," 10",[408,3181,585],{"class":584},[408,3183,3184,3187,3190],{"class":410,"line":1270},[408,3185,3186],{"class":418},"  --validator.type",[408,3188,3189],{"class":418}," aws",[408,3191,585],{"class":584},[408,3193,3194,3197],{"class":410,"line":1283},[408,3195,3196],{"class":418},"  --validator.region",[408,3198,3199],{"class":584}," $AWS_REGION \\\n",[408,3201,3202,3205,3208],{"class":410,"line":1295},[408,3203,3204],{"class":418},"  --validator.id",[408,3206,3207],{"class":418}," alias/hyperlane-validator-signer-bitsong",[408,3209,585],{"class":584},[408,3211,3212,3215,3218],{"class":410,"line":1305},[408,3213,3214],{"class":418},"  --chains.bitsong.signer.type",[408,3216,3217],{"class":418}," cosmosKey",[408,3219,585],{"class":584},[408,3221,3222,3225],{"class":410,"line":1310},[408,3223,3224],{"class":418},"  --chains.bitsong.signer.key",[408,3226,3227],{"class":584}," $COSMOS_SIGNER_KEY \\\n",[408,3229,3230,3233,3235],{"class":410,"line":1327},[408,3231,3232],{"class":418},"  --chains.bitsong.signer.prefix",[408,3234,3160],{"class":418},[408,3236,585],{"class":584},[408,3238,3239,3242,3244],{"class":410,"line":1333},[408,3240,3241],{"class":418},"  --checkpointSyncer.type",[408,3243,1358],{"class":418},[408,3245,585],{"class":584},[408,3247,3248,3251],{"class":410,"line":1339},[408,3249,3250],{"class":418},"  --checkpointSyncer.bucket",[408,3252,3253],{"class":584}," $S3_BUCKET \\\n",[408,3255,3256,3259],{"class":410,"line":2254},[408,3257,3258],{"class":418},"  --checkpointSyncer.region",[408,3260,3199],{"class":584},[408,3262,3263,3266,3268],{"class":410,"line":2269},[408,3264,3265],{"class":418},"  --checkpointSyncer.folder",[408,3267,3160],{"class":418},[408,3269,585],{"class":584},[408,3271,3272,3275,3278],{"class":410,"line":2274},[408,3273,3274],{"class":418},"  --metrics-port",[408,3276,3277],{"class":523}," 9090",[408,3279,585],{"class":584},[408,3281,3282,3285,3287],{"class":410,"line":2315},[408,3283,3284],{"class":418},"  --log.format",[408,3286,2819],{"class":418},[408,3288,585],{"class":584},[408,3290,3291,3294],{"class":410,"line":2336},[408,3292,3293],{"class":418},"  --log.level",[408,3295,3296],{"class":418}," info\n",[757,3298,3300],{"id":3299},"base-sepolia-validator","Base Sepolia Validator",[121,3302,3303],{},"This validator watches Base Sepolia and writes Base Sepolia checkpoint signatures to S3.",[398,3305,3307],{"className":400,"code":3306,"filename":402,"language":403,"meta":404,"style":404},"source $HOME/hyperlane-bitsong/validator.env\n\ndocker run -d \\\n  --name hyperlane-validator-basesepolia \\\n  --restart unless-stopped \\\n  --network host \\\n  --user $(id -u):$(id -g) \\\n  --env-file $HOME/hyperlane-bitsong/validator.env \\\n  -e CONFIG_FILES=/config/agent-config.json \\\n  -v $HOME/hyperlane-bitsong/config/agent-config.json:/config/agent-config.json:ro \\\n  -v $HOME/hyperlane-bitsong/db/validator-basesepolia:/hyperlane_db \\\n  --log-driver json-file \\\n  --log-opt max-size=50m \\\n  --log-opt max-file=5 \\\n  $HYPERLANE_IMAGE \\\n  ./validator \\\n  --db /hyperlane_db \\\n  --originChainName basesepolia \\\n  --reorgPeriod 1 \\\n  --interval 10 \\\n  --validator.type aws \\\n  --validator.region $AWS_REGION \\\n  --validator.id alias/hyperlane-validator-signer-bitsong \\\n  --chains.basesepolia.signer.type aws \\\n  --chains.basesepolia.signer.region $AWS_REGION \\\n  --chains.basesepolia.signer.id alias/hyperlane-validator-signer-bitsong \\\n  --checkpointSyncer.type s3 \\\n  --checkpointSyncer.bucket $S3_BUCKET \\\n  --checkpointSyncer.region $AWS_REGION \\\n  --checkpointSyncer.folder basesepolia \\\n  --metrics-port 9091 \\\n  --log.format json \\\n  --log.level info\n",[154,3308,3309,3317,3321,3331,3340,3348,3356,3380,3390,3398,3408,3419,3427,3435,3445,3449,3455,3463,3472,3480,3488,3496,3502,3510,3519,3526,3535,3543,3549,3555,3563,3572,3580],{"__ignoreMap":404},[408,3310,3311,3313,3315],{"class":410,"line":411},[408,3312,486],{"class":485},[408,3314,1627],{"class":584},[408,3316,1729],{"class":418},[408,3318,3319],{"class":410,"line":425},[408,3320,575],{"emptyLinePlaceholder":574},[408,3322,3323,3325,3327,3329],{"class":410,"line":492},[408,3324,736],{"class":414},[408,3326,745],{"class":418},[408,3328,527],{"class":418},[408,3330,585],{"class":584},[408,3332,3333,3335,3338],{"class":410,"line":498},[408,3334,3000],{"class":418},[408,3336,3337],{"class":418}," hyperlane-validator-basesepolia",[408,3339,585],{"class":584},[408,3341,3342,3344,3346],{"class":410,"line":578},[408,3343,3010],{"class":418},[408,3345,3013],{"class":418},[408,3347,585],{"class":584},[408,3349,3350,3352,3354],{"class":410,"line":588},[408,3351,3020],{"class":418},[408,3353,3023],{"class":418},[408,3355,585],{"class":584},[408,3357,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376,3378],{"class":410,"line":615},[408,3359,3030],{"class":418},[408,3361,1522],{"class":476},[408,3363,3035],{"class":414},[408,3365,3038],{"class":418},[408,3367,606],{"class":476},[408,3369,180],{"class":418},[408,3371,597],{"class":476},[408,3373,3035],{"class":414},[408,3375,3049],{"class":418},[408,3377,606],{"class":476},[408,3379,585],{"class":584},[408,3381,3382,3384,3386,3388],{"class":410,"line":651},[408,3383,3058],{"class":418},[408,3385,1627],{"class":584},[408,3387,3063],{"class":418},[408,3389,585],{"class":584},[408,3391,3392,3394,3396],{"class":410,"line":669},[408,3393,3070],{"class":418},[408,3395,3073],{"class":418},[408,3397,585],{"class":584},[408,3399,3400,3402,3404,3406],{"class":410,"line":674},[408,3401,3080],{"class":418},[408,3403,1627],{"class":584},[408,3405,3085],{"class":418},[408,3407,585],{"class":584},[408,3409,3410,3412,3414,3417],{"class":410,"line":683},[408,3411,3080],{"class":418},[408,3413,1627],{"class":584},[408,3415,3416],{"class":418},"/hyperlane-bitsong/db/validator-basesepolia:/hyperlane_db",[408,3418,585],{"class":584},[408,3420,3421,3423,3425],{"class":410,"line":709},[408,3422,3103],{"class":418},[408,3424,3106],{"class":418},[408,3426,585],{"class":584},[408,3428,3429,3431,3433],{"class":410,"line":1186},[408,3430,3113],{"class":418},[408,3432,3116],{"class":418},[408,3434,585],{"class":584},[408,3436,3437,3439,3441,3443],{"class":410,"line":1196},[408,3438,3113],{"class":418},[408,3440,3125],{"class":418},[408,3442,3128],{"class":523},[408,3444,585],{"class":584},[408,3446,3447],{"class":410,"line":1202},[408,3448,3135],{"class":584},[408,3450,3451,3453],{"class":410,"line":1208},[408,3452,3140],{"class":418},[408,3454,585],{"class":584},[408,3456,3457,3459,3461],{"class":410,"line":1213},[408,3458,3147],{"class":418},[408,3460,3150],{"class":418},[408,3462,585],{"class":584},[408,3464,3465,3467,3470],{"class":410,"line":1232},[408,3466,3157],{"class":418},[408,3468,3469],{"class":418}," basesepolia",[408,3471,585],{"class":584},[408,3473,3474,3476,3478],{"class":410,"line":1246},[408,3475,3167],{"class":418},[408,3477,2234],{"class":523},[408,3479,585],{"class":584},[408,3481,3482,3484,3486],{"class":410,"line":1264},[408,3483,3176],{"class":418},[408,3485,3179],{"class":523},[408,3487,585],{"class":584},[408,3489,3490,3492,3494],{"class":410,"line":1270},[408,3491,3186],{"class":418},[408,3493,3189],{"class":418},[408,3495,585],{"class":584},[408,3497,3498,3500],{"class":410,"line":1283},[408,3499,3196],{"class":418},[408,3501,3199],{"class":584},[408,3503,3504,3506,3508],{"class":410,"line":1295},[408,3505,3204],{"class":418},[408,3507,3207],{"class":418},[408,3509,585],{"class":584},[408,3511,3512,3515,3517],{"class":410,"line":1305},[408,3513,3514],{"class":418},"  --chains.basesepolia.signer.type",[408,3516,3189],{"class":418},[408,3518,585],{"class":584},[408,3520,3521,3524],{"class":410,"line":1310},[408,3522,3523],{"class":418},"  --chains.basesepolia.signer.region",[408,3525,3199],{"class":584},[408,3527,3528,3531,3533],{"class":410,"line":1327},[408,3529,3530],{"class":418},"  --chains.basesepolia.signer.id",[408,3532,3207],{"class":418},[408,3534,585],{"class":584},[408,3536,3537,3539,3541],{"class":410,"line":1333},[408,3538,3241],{"class":418},[408,3540,1358],{"class":418},[408,3542,585],{"class":584},[408,3544,3545,3547],{"class":410,"line":1339},[408,3546,3250],{"class":418},[408,3548,3253],{"class":584},[408,3550,3551,3553],{"class":410,"line":2254},[408,3552,3258],{"class":418},[408,3554,3199],{"class":584},[408,3556,3557,3559,3561],{"class":410,"line":2269},[408,3558,3265],{"class":418},[408,3560,3469],{"class":418},[408,3562,585],{"class":584},[408,3564,3565,3567,3570],{"class":410,"line":2274},[408,3566,3274],{"class":418},[408,3568,3569],{"class":523}," 9091",[408,3571,585],{"class":584},[408,3573,3574,3576,3578],{"class":410,"line":2315},[408,3575,3284],{"class":418},[408,3577,2819],{"class":418},[408,3579,585],{"class":584},[408,3581,3582,3584],{"class":410,"line":2336},[408,3583,3293],{"class":418},[408,3585,3296],{"class":418},[159,3587,3588,3589,3592],{},"The Base Sepolia validator sends an on-chain announcement transaction. Fund the KMS-derived ",[154,3590,3591],{},"VALIDATOR_ADDR"," with Base Sepolia ETH before starting this container.",[167,3594,3596],{"id":3595},"verify-operation","Verify Operation",[121,3598,3599],{},"Check that both containers are running:",[398,3601,3603],{"className":400,"code":3602,"filename":402,"language":403,"meta":404,"style":404},"docker ps --filter \"name=hyperlane-validator\" --format \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\"\n",[154,3604,3605],{"__ignoreMap":404},[408,3606,3607,3609,3612,3615,3617,3620,3622,3625,3627,3630],{"class":410,"line":411},[408,3608,736],{"class":414},[408,3610,3611],{"class":418}," ps",[408,3613,3614],{"class":418}," --filter",[408,3616,632],{"class":476},[408,3618,3619],{"class":418},"name=hyperlane-validator",[408,3621,644],{"class":476},[408,3623,3624],{"class":418}," --format",[408,3626,632],{"class":476},[408,3628,3629],{"class":418},"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}",[408,3631,819],{"class":476},[121,3633,3634],{},"Read logs:",[398,3636,3638],{"className":400,"code":3637,"filename":402,"language":403,"meta":404,"style":404},"docker logs -f --tail 100 hyperlane-validator-bitsong\ndocker logs -f --tail 100 hyperlane-validator-basesepolia\n",[154,3639,3640,3659],{"__ignoreMap":404},[408,3641,3642,3644,3647,3650,3653,3656],{"class":410,"line":411},[408,3643,736],{"class":414},[408,3645,3646],{"class":418}," logs",[408,3648,3649],{"class":418}," -f",[408,3651,3652],{"class":418}," --tail",[408,3654,3655],{"class":523}," 100",[408,3657,3658],{"class":418}," hyperlane-validator-bitsong\n",[408,3660,3661,3663,3665,3667,3669,3671],{"class":410,"line":425},[408,3662,736],{"class":414},[408,3664,3646],{"class":418},[408,3666,3649],{"class":418},[408,3668,3652],{"class":418},[408,3670,3655],{"class":523},[408,3672,3673],{"class":418}," hyperlane-validator-basesepolia\n",[121,3675,3676],{},"Check for checkpoint files:",[398,3678,3680],{"className":400,"code":3679,"filename":402,"language":403,"meta":404,"style":404},"source $HOME/hyperlane-bitsong/validator.env\naws s3 ls s3://$S3_BUCKET/bitsong/ --recursive\naws s3 ls s3://$S3_BUCKET/basesepolia/ --recursive\n",[154,3681,3682,3690,3710],{"__ignoreMap":404},[408,3683,3684,3686,3688],{"class":410,"line":411},[408,3685,486],{"class":485},[408,3687,1627],{"class":584},[408,3689,1729],{"class":418},[408,3691,3692,3694,3696,3698,3701,3704,3707],{"class":410,"line":425},[408,3693,1355],{"class":414},[408,3695,1358],{"class":418},[408,3697,1376],{"class":418},[408,3699,3700],{"class":418}," s3://",[408,3702,3703],{"class":584},"$S3_BUCKET",[408,3705,3706],{"class":418},"/bitsong/",[408,3708,3709],{"class":418}," --recursive\n",[408,3711,3712,3714,3716,3718,3720,3722,3725],{"class":410,"line":492},[408,3713,1355],{"class":414},[408,3715,1358],{"class":418},[408,3717,1376],{"class":418},[408,3719,3700],{"class":418},[408,3721,3703],{"class":584},[408,3723,3724],{"class":418},"/basesepolia/",[408,3726,3709],{"class":418},[121,3728,3729],{},"Check BitSong storage announcement:",[398,3731,3733],{"className":400,"code":3732,"filename":402,"language":403,"meta":404,"style":404},"bitsongd query hyperlane ism announced-storage-locations \\\n  \u003Cbitsong-mailbox-id> $(echo $VALIDATOR_ADDR | tr '[:upper:]' '[:lower:]') \\\n  --output json \\\n  --node tcp://localhost:26657 | jq '.storage_locations'\n",[154,3734,3735,3751,3796,3805],{"__ignoreMap":404},[408,3736,3737,3739,3741,3743,3746,3749],{"class":410,"line":411},[408,3738,1410],{"class":414},[408,3740,2807],{"class":418},[408,3742,2810],{"class":418},[408,3744,3745],{"class":418}," ism",[408,3747,3748],{"class":418}," announced-storage-locations",[408,3750,585],{"class":584},[408,3752,3753,3756,3759,3762,3764,3766,3768,3771,3774,3777,3779,3782,3785,3787,3790,3792,3794],{"class":410,"line":425},[408,3754,3755],{"class":476},"  \u003C",[408,3757,3758],{"class":418},"bitsong-mailbox-i",[408,3760,3761],{"class":584},"d",[408,3763,1519],{"class":476},[408,3765,1522],{"class":476},[408,3767,581],{"class":485},[408,3769,3770],{"class":584}," $VALIDATOR_ADDR ",[408,3772,3773],{"class":476},"|",[408,3775,3776],{"class":414}," tr",[408,3778,2831],{"class":476},[408,3780,3781],{"class":418},"[:upper:]",[408,3783,3784],{"class":476},"'",[408,3786,2831],{"class":476},[408,3788,3789],{"class":418},"[:lower:]",[408,3791,3784],{"class":476},[408,3793,606],{"class":476},[408,3795,585],{"class":584},[408,3797,3798,3801,3803],{"class":410,"line":492},[408,3799,3800],{"class":418},"  --output",[408,3802,2819],{"class":418},[408,3804,585],{"class":584},[408,3806,3807,3809,3811,3813,3815,3817,3820],{"class":410,"line":498},[408,3808,1584],{"class":418},[408,3810,1587],{"class":418},[408,3812,477],{"class":476},[408,3814,447],{"class":414},[408,3816,2831],{"class":476},[408,3818,3819],{"class":418},".storage_locations",[408,3821,2837],{"class":476},[121,3823,3824,3825,3828],{},"A non-empty ",[154,3826,3827],{},"storage_locations"," array means the validator announced where relayers can find its checkpoints.",[271,3830,3831],{},"Checkpoint files appear when messages are dispatched from the origin Mailbox. An empty S3 folder can be normal before any bridge activity, but the containers should still stay healthy and logs should not show signing, RPC, KMS, S3, or announcement errors.",[167,3833,30],{"id":151},[121,3835,3836],{},"Hyperlane validators expose Prometheus metrics. This guide uses:",[182,3838,3839,3848],{},[185,3840,3841],{},[188,3842,3843,3845],{},[191,3844,193],{},[191,3846,3847],{},"Metrics port",[204,3849,3850,3861],{},[188,3851,3852,3856],{},[209,3853,3854],{},[154,3855,213],{},[209,3857,3858],{},[154,3859,3860],{},"9090",[188,3862,3863,3867],{},[209,3864,3865],{},[154,3866,231],{},[209,3868,3869],{},[154,3870,3871],{},"9091",[121,3873,3874],{},"Example Prometheus scrape config:",[398,3876,3881],{"className":3877,"code":3878,"filename":3879,"language":3880,"meta":404,"style":404},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","scrape_configs:\n  - job_name: hyperlane-validator-bitsong\n    static_configs:\n      - targets: [\"127.0.0.1:9090\"]\n\n  - job_name: hyperlane-validator-basesepolia\n    static_configs:\n      - targets: [\"127.0.0.1:9091\"]\n","prometheus.yml","yaml",[154,3882,3883,3891,3903,3910,3933,3937,3947,3953],{"__ignoreMap":404},[408,3884,3885,3888],{"class":410,"line":411},[408,3886,3887],{"class":1991},"scrape_configs",[408,3889,3890],{"class":476},":\n",[408,3892,3893,3896,3899,3901],{"class":410,"line":425},[408,3894,3895],{"class":476},"  -",[408,3897,3898],{"class":1991}," job_name",[408,3900,180],{"class":476},[408,3902,3658],{"class":418},[408,3904,3905,3908],{"class":410,"line":492},[408,3906,3907],{"class":1991},"    static_configs",[408,3909,3890],{"class":476},[408,3911,3912,3915,3918,3920,3923,3925,3928,3930],{"class":410,"line":498},[408,3913,3914],{"class":476},"      -",[408,3916,3917],{"class":1991}," targets",[408,3919,180],{"class":476},[408,3921,3922],{"class":476}," [",[408,3924,644],{"class":476},[408,3926,3927],{"class":418},"127.0.0.1:9090",[408,3929,644],{"class":476},[408,3931,3932],{"class":476},"]\n",[408,3934,3935],{"class":410,"line":578},[408,3936,575],{"emptyLinePlaceholder":574},[408,3938,3939,3941,3943,3945],{"class":410,"line":588},[408,3940,3895],{"class":476},[408,3942,3898],{"class":1991},[408,3944,180],{"class":476},[408,3946,3673],{"class":418},[408,3948,3949,3951],{"class":410,"line":615},[408,3950,3907],{"class":1991},[408,3952,3890],{"class":476},[408,3954,3955,3957,3959,3961,3963,3965,3968,3970],{"class":410,"line":651},[408,3956,3914],{"class":476},[408,3958,3917],{"class":1991},[408,3960,180],{"class":476},[408,3962,3922],{"class":476},[408,3964,644],{"class":476},[408,3966,3967],{"class":418},"127.0.0.1:9091",[408,3969,644],{"class":476},[408,3971,3932],{"class":476},[121,3973,3974],{},"Important metrics:",[182,3976,3977,3987],{},[185,3978,3979],{},[188,3980,3981,3984],{},[191,3982,3983],{},"Metric",[191,3985,3986],{},"What to watch",[204,3988,3989,3999,4009,4019,4029,4039,4049],{},[188,3990,3991,3996],{},[209,3992,3993],{},[154,3994,3995],{},"hyperlane_latest_checkpoint",[209,3997,3998],{},"Should increase when the origin chain dispatches messages",[188,4000,4001,4006],{},[209,4002,4003],{},[154,4004,4005],{},"hyperlane_block_height",[209,4007,4008],{},"Should keep increasing while the RPC is healthy",[188,4010,4011,4016],{},[209,4012,4013],{},[154,4014,4015],{},"hyperlane_contract_sync_liveness",[209,4017,4018],{},"Should continue moving; a flat value means the indexing loop may be stuck",[188,4020,4021,4026],{},[209,4022,4023],{},[154,4024,4025],{},"hyperlane_contract_sync_block_height",[209,4027,4028],{},"Should follow the chain's block production",[188,4030,4031,4036],{},[209,4032,4033],{},[154,4034,4035],{},"hyperlane_cursor_current_block",[209,4037,4038],{},"Should advance as the validator indexes",[188,4040,4041,4046],{},[209,4042,4043],{},[154,4044,4045],{},"hyperlane_span_events_total{agent=\"validator\", event_level=\"error\"}",[209,4047,4048],{},"Alert on repeated increases",[188,4050,4051,4056],{},[209,4052,4053],{},[154,4054,4055],{},"hyperlane_span_events_total{agent=\"validator\", event_level=\"warn\"}",[209,4057,4058],{},"Investigate sustained increases",[121,4060,4061],{},"Recommended alerts:",[245,4063,4064,4069,4074,4079,4082],{},[248,4065,4066,4068],{},[154,4067,4005],{}," does not increase for 30 minutes",[248,4070,4071,4073],{},[154,4072,4015],{}," is flat for 15 minutes",[248,4075,4076,4078],{},[154,4077,3995],{}," does not increase while messages are being dispatched and block height is increasing",[248,4080,4081],{},"Error logs increase repeatedly over a 1 hour window",[248,4083,4084],{},"No checkpoint objects appear in S3 after known Mailbox dispatches",[121,4086,4087],{},"When an alert fires, check logs first, then RPC health, AWS KMS access, S3 permissions, and account balances.",[167,4089,4091],{"id":4090},"optional-relayer","Optional Relayer",[121,4093,4094,4095,4098],{},"Validators provide security signatures. A relayer provides transport. If your team is also operating the bridge relayer, run it with a ",[125,4096,4097],{},"separate KMS key"," so relayer gas spending is isolated from validator signing.",[121,4100,4101],{},"Create another KMS key:",[398,4103,4107],{"className":4104,"code":4105,"filename":4106,"language":770,"meta":404},[767],"hyperlane-relayer-bitsong\n","KMS alias",[154,4108,4105],{"__ignoreMap":404},[121,4110,4111],{},"Fund the relayer KMS address with Base Sepolia ETH:",[398,4113,4115],{"className":400,"code":4114,"filename":402,"language":403,"meta":404,"style":404},"AWS_KMS_KEY_ID=alias/hyperlane-relayer-bitsong cast wallet address --aws\n",[154,4116,4117],{"__ignoreMap":404},[408,4118,4119,4121,4123,4126,4129,4132,4134],{"class":410,"line":411},[408,4120,930],{"class":584},[408,4122,811],{"class":476},[408,4124,4125],{"class":418},"alias/hyperlane-relayer-bitsong",[408,4127,4128],{"class":414}," cast",[408,4130,4131],{"class":418}," wallet",[408,4133,948],{"class":418},[408,4135,951],{"class":418},[121,4137,4138],{},"Start the relayer:",[398,4140,4142],{"className":400,"code":4141,"filename":402,"language":403,"meta":404,"style":404},"mkdir -p $HOME/hyperlane-bitsong/db/relayer\nsource $HOME/hyperlane-bitsong/validator.env\n\ndocker run -d \\\n  --name hyperlane-relayer \\\n  --restart unless-stopped \\\n  --network host \\\n  --user $(id -u):$(id -g) \\\n  --env-file $HOME/hyperlane-bitsong/validator.env \\\n  -e CONFIG_FILES=/config/agent-config.json \\\n  -v $HOME/hyperlane-bitsong/config/agent-config.json:/config/agent-config.json:ro \\\n  -v $HOME/hyperlane-bitsong/db/relayer:/hyperlane_db \\\n  --log-driver json-file \\\n  --log-opt max-size=50m \\\n  --log-opt max-file=5 \\\n  $HYPERLANE_IMAGE \\\n  ./relayer \\\n  --db /hyperlane_db \\\n  --relayChains bitsong,basesepolia \\\n  --gaspaymentenforcement '[{\"type\":\"none\"}]' \\\n  --chains.bitsong.signer.type cosmosKey \\\n  --chains.bitsong.signer.key $COSMOS_SIGNER_KEY \\\n  --chains.bitsong.signer.prefix bitsong \\\n  --chains.basesepolia.signer.type aws \\\n  --chains.basesepolia.signer.region $AWS_REGION \\\n  --chains.basesepolia.signer.id alias/hyperlane-relayer-bitsong \\\n  --metrics-port 9092 \\\n  --log.format json \\\n  --log.level info\n",[154,4143,4144,4155,4163,4167,4177,4186,4194,4202,4226,4236,4244,4254,4265,4273,4281,4291,4295,4302,4310,4320,4334,4342,4348,4356,4364,4370,4379,4388,4396],{"__ignoreMap":404},[408,4145,4146,4148,4150,4152],{"class":410,"line":411},[408,4147,1621],{"class":414},[408,4149,1624],{"class":418},[408,4151,1627],{"class":584},[408,4153,4154],{"class":418},"/hyperlane-bitsong/db/relayer\n",[408,4156,4157,4159,4161],{"class":410,"line":425},[408,4158,486],{"class":485},[408,4160,1627],{"class":584},[408,4162,1729],{"class":418},[408,4164,4165],{"class":410,"line":492},[408,4166,575],{"emptyLinePlaceholder":574},[408,4168,4169,4171,4173,4175],{"class":410,"line":498},[408,4170,736],{"class":414},[408,4172,745],{"class":418},[408,4174,527],{"class":418},[408,4176,585],{"class":584},[408,4178,4179,4181,4184],{"class":410,"line":578},[408,4180,3000],{"class":418},[408,4182,4183],{"class":418}," hyperlane-relayer",[408,4185,585],{"class":584},[408,4187,4188,4190,4192],{"class":410,"line":588},[408,4189,3010],{"class":418},[408,4191,3013],{"class":418},[408,4193,585],{"class":584},[408,4195,4196,4198,4200],{"class":410,"line":615},[408,4197,3020],{"class":418},[408,4199,3023],{"class":418},[408,4201,585],{"class":584},[408,4203,4204,4206,4208,4210,4212,4214,4216,4218,4220,4222,4224],{"class":410,"line":651},[408,4205,3030],{"class":418},[408,4207,1522],{"class":476},[408,4209,3035],{"class":414},[408,4211,3038],{"class":418},[408,4213,606],{"class":476},[408,4215,180],{"class":418},[408,4217,597],{"class":476},[408,4219,3035],{"class":414},[408,4221,3049],{"class":418},[408,4223,606],{"class":476},[408,4225,585],{"class":584},[408,4227,4228,4230,4232,4234],{"class":410,"line":669},[408,4229,3058],{"class":418},[408,4231,1627],{"class":584},[408,4233,3063],{"class":418},[408,4235,585],{"class":584},[408,4237,4238,4240,4242],{"class":410,"line":674},[408,4239,3070],{"class":418},[408,4241,3073],{"class":418},[408,4243,585],{"class":584},[408,4245,4246,4248,4250,4252],{"class":410,"line":683},[408,4247,3080],{"class":418},[408,4249,1627],{"class":584},[408,4251,3085],{"class":418},[408,4253,585],{"class":584},[408,4255,4256,4258,4260,4263],{"class":410,"line":709},[408,4257,3080],{"class":418},[408,4259,1627],{"class":584},[408,4261,4262],{"class":418},"/hyperlane-bitsong/db/relayer:/hyperlane_db",[408,4264,585],{"class":584},[408,4266,4267,4269,4271],{"class":410,"line":1186},[408,4268,3103],{"class":418},[408,4270,3106],{"class":418},[408,4272,585],{"class":584},[408,4274,4275,4277,4279],{"class":410,"line":1196},[408,4276,3113],{"class":418},[408,4278,3116],{"class":418},[408,4280,585],{"class":584},[408,4282,4283,4285,4287,4289],{"class":410,"line":1202},[408,4284,3113],{"class":418},[408,4286,3125],{"class":418},[408,4288,3128],{"class":523},[408,4290,585],{"class":584},[408,4292,4293],{"class":410,"line":1208},[408,4294,3135],{"class":584},[408,4296,4297,4300],{"class":410,"line":1213},[408,4298,4299],{"class":418},"  ./relayer",[408,4301,585],{"class":584},[408,4303,4304,4306,4308],{"class":410,"line":1232},[408,4305,3147],{"class":418},[408,4307,3150],{"class":418},[408,4309,585],{"class":584},[408,4311,4312,4315,4318],{"class":410,"line":1246},[408,4313,4314],{"class":418},"  --relayChains",[408,4316,4317],{"class":418}," bitsong,basesepolia",[408,4319,585],{"class":584},[408,4321,4322,4325,4327,4330,4332],{"class":410,"line":1264},[408,4323,4324],{"class":418},"  --gaspaymentenforcement",[408,4326,2831],{"class":476},[408,4328,4329],{"class":418},"[{\"type\":\"none\"}]",[408,4331,3784],{"class":476},[408,4333,585],{"class":584},[408,4335,4336,4338,4340],{"class":410,"line":1270},[408,4337,3214],{"class":418},[408,4339,3217],{"class":418},[408,4341,585],{"class":584},[408,4343,4344,4346],{"class":410,"line":1283},[408,4345,3224],{"class":418},[408,4347,3227],{"class":584},[408,4349,4350,4352,4354],{"class":410,"line":1295},[408,4351,3232],{"class":418},[408,4353,3160],{"class":418},[408,4355,585],{"class":584},[408,4357,4358,4360,4362],{"class":410,"line":1305},[408,4359,3514],{"class":418},[408,4361,3189],{"class":418},[408,4363,585],{"class":584},[408,4365,4366,4368],{"class":410,"line":1310},[408,4367,3523],{"class":418},[408,4369,3199],{"class":584},[408,4371,4372,4374,4377],{"class":410,"line":1327},[408,4373,3530],{"class":418},[408,4375,4376],{"class":418}," alias/hyperlane-relayer-bitsong",[408,4378,585],{"class":584},[408,4380,4381,4383,4386],{"class":410,"line":1333},[408,4382,3274],{"class":418},[408,4384,4385],{"class":523}," 9092",[408,4387,585],{"class":584},[408,4389,4390,4392,4394],{"class":410,"line":1339},[408,4391,3284],{"class":418},[408,4393,2819],{"class":418},[408,4395,585],{"class":584},[408,4397,4398,4400],{"class":410,"line":2254},[408,4399,3293],{"class":418},[408,4401,3296],{"class":418},[4403,4404,4405,4408],"caution",{},[154,4406,4407],{},"--gaspaymentenforcement '[{\"type\":\"none\"}]'"," is acceptable for this testnet guide. For a production mainnet bridge, configure gas payment enforcement so relayers are compensated.",[167,4410,4412],{"id":4411},"operations","Operations",[121,4414,4415],{},"Restart one validator:",[398,4417,4419],{"className":400,"code":4418,"filename":402,"language":403,"meta":404,"style":404},"docker restart hyperlane-validator-bitsong\n",[154,4420,4421],{"__ignoreMap":404},[408,4422,4423,4425,4428],{"class":410,"line":411},[408,4424,736],{"class":414},[408,4426,4427],{"class":418}," restart",[408,4429,3658],{"class":418},[121,4431,4432],{},"Stop the stack:",[398,4434,4436],{"className":400,"code":4435,"filename":402,"language":403,"meta":404,"style":404},"docker stop hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer\n",[154,4437,4438],{"__ignoreMap":404},[408,4439,4440,4442,4445,4447,4449],{"class":410,"line":411},[408,4441,736],{"class":414},[408,4443,4444],{"class":418}," stop",[408,4446,3003],{"class":418},[408,4448,3337],{"class":418},[408,4450,4451],{"class":418}," hyperlane-relayer\n",[121,4453,4454],{},"Upgrade the Hyperlane image:",[398,4456,4458],{"className":400,"code":4457,"filename":402,"language":403,"meta":404,"style":404},"source $HOME/hyperlane-bitsong/validator.env\ndocker pull --platform linux/amd64 $HYPERLANE_IMAGE\ndocker stop hyperlane-validator-bitsong hyperlane-validator-basesepolia\ndocker rm hyperlane-validator-bitsong hyperlane-validator-basesepolia\n",[154,4459,4460,4468,4480,4490],{"__ignoreMap":404},[408,4461,4462,4464,4466],{"class":410,"line":411},[408,4463,486],{"class":485},[408,4465,1627],{"class":584},[408,4467,1729],{"class":418},[408,4469,4470,4472,4474,4476,4478],{"class":410,"line":425},[408,4471,736],{"class":414},[408,4473,1752],{"class":418},[408,4475,1755],{"class":418},[408,4477,1758],{"class":418},[408,4479,1761],{"class":584},[408,4481,4482,4484,4486,4488],{"class":410,"line":492},[408,4483,736],{"class":414},[408,4485,4444],{"class":418},[408,4487,3003],{"class":418},[408,4489,3673],{"class":418},[408,4491,4492,4494,4496,4498],{"class":410,"line":498},[408,4493,736],{"class":414},[408,4495,1388],{"class":418},[408,4497,3003],{"class":418},[408,4499,3673],{"class":418},[121,4501,4502],{},"Then rerun the start commands. Keep the database directories; do not delete them during normal upgrades.",[121,4504,4505],{},"Back up:",[245,4507,4508,4512,4516,4519,4522],{},[248,4509,4510],{},[154,4511,1790],{},[248,4513,4514],{},[154,4515,1637],{},[248,4517,4518],{},"The AWS KMS key alias and key ID",[248,4520,4521],{},"S3 bucket name and policy",[248,4523,4524],{},"The Cosmos signer key mnemonic or private key",[167,4526,4528],{"id":4527},"troubleshooting","Troubleshooting",[4530,4531,4532,4558,4586,4618,4650,4677,4683],"accordion",{},[4533,4534,4537,4540,4553],"accordion-item",{"icon":4535,"label":4536},"i-lucide-circle-help","Validator starts, then exits immediately",[121,4538,4539],{},"Check logs:",[398,4541,4543],{"className":400,"code":4542,"filename":402,"language":403,"meta":404,"style":404},"docker logs hyperlane-validator-bitsong\n",[154,4544,4545],{"__ignoreMap":404},[408,4546,4547,4549,4551],{"class":410,"line":411},[408,4548,736],{"class":414},[408,4550,3646],{"class":418},[408,4552,3658],{"class":418},[121,4554,4555,4556,128],{},"Common causes are invalid JSON config, unreachable RPC/gRPC endpoints, missing AWS credentials, wrong KMS alias, or missing ",[154,4557,1438],{},[4533,4559,4561,4570],{"icon":4535,"label":4560},"AWS Missing Region",[121,4562,4563,4564,4566,4567,4569],{},"Set ",[154,4565,1668],{}," in ",[154,4568,1637],{}," and pass the env file to Docker:",[398,4571,4573],{"className":400,"code":4572,"filename":402,"language":403,"meta":404,"style":404},"grep AWS_REGION $HOME/hyperlane-bitsong/validator.env\n",[154,4574,4575],{"__ignoreMap":404},[408,4576,4577,4580,4582,4584],{"class":410,"line":411},[408,4578,4579],{"class":414},"grep",[408,4581,842],{"class":418},[408,4583,1627],{"class":584},[408,4585,1729],{"class":418},[4533,4587,4589,4592,4613],{"icon":4535,"label":4588},"BitSong validator does not announce",[121,4590,4591],{},"The Cosmos signer needs TBTSG. Check the address:",[398,4593,4595],{"className":400,"code":4594,"filename":402,"language":403,"meta":404,"style":404},"bitsongd keys show hyperlane-signer -a --keyring-backend test\n",[154,4596,4597],{"__ignoreMap":404},[408,4598,4599,4601,4603,4605,4607,4609,4611],{"class":410,"line":411},[408,4600,1410],{"class":414},[408,4602,1413],{"class":418},[408,4604,1529],{"class":418},[408,4606,1419],{"class":418},[408,4608,1534],{"class":418},[408,4610,1422],{"class":418},[408,4612,1425],{"class":418},[121,4614,4615,4616,128],{},"Fund it and restart ",[154,4617,213],{},[4533,4619,4621,4624,4645],{"icon":4535,"label":4620},"Base Sepolia validator does not announce",[121,4622,4623],{},"The KMS-derived validator address needs Base Sepolia ETH. Query it:",[398,4625,4627],{"className":400,"code":4626,"filename":402,"language":403,"meta":404,"style":404},"AWS_KMS_KEY_ID=alias/hyperlane-validator-signer-bitsong cast wallet address --aws\n",[154,4628,4629],{"__ignoreMap":404},[408,4630,4631,4633,4635,4637,4639,4641,4643],{"class":410,"line":411},[408,4632,930],{"class":584},[408,4634,811],{"class":476},[408,4636,935],{"class":418},[408,4638,4128],{"class":414},[408,4640,4131],{"class":418},[408,4642,948],{"class":418},[408,4644,951],{"class":418},[121,4646,4647,4648,128],{},"Fund that address and restart ",[154,4649,231],{},[4533,4651,4653,4656],{"icon":4535,"label":4652},"No S3 checkpoint files",[121,4654,4655],{},"First confirm that messages have actually been dispatched from the origin Mailbox. Then check:",[245,4657,4658,4661,4664,4667,4670],{},[248,4659,4660],{},"S3 bucket write permission for the IAM user",[248,4662,4663],{},"Public bucket policy",[248,4665,4666],{},"Validator logs for KMS or S3 errors",[248,4668,4669],{},"RPC health",[248,4671,4672,1025,4674,4676],{},[154,4673,3995],{},[154,4675,4015],{}," metrics",[4533,4678,4680,4681,128],{"icon":4535,"label":4679},"RPC is unstable","Move to private RPC endpoints and configure redundancy. EVM chains can use multiple RPC URLs. Cosmos chains require RPC and gRPC endpoints; configure both and monitor ",[154,4682,4005],{},[4533,4684,4686],{"icon":4535,"label":4685},"Messages are signed but not delivered","Validators only publish signatures. Delivery is a relayer responsibility. Check the relayer logs, destination gas balance, S3 read access, and the ISM validator address configured on the destination chain.",[167,4688,4690],{"id":4689},"final-validation","Final Validation",[121,4692,4693],{},"You are production-ready for this testnet when:",[245,4695,4696,4699,4702,4705,4708,4711],{},[248,4697,4698],{},"Both validator containers restart automatically after reboot",[248,4700,4701],{},"Both validators expose metrics and are scraped",[248,4703,4704],{},"S3 contains checkpoint objects after bridge messages are dispatched",[248,4706,4707],{},"Validator announcements are visible on-chain",[248,4709,4710],{},"No validator errors are increasing over time",[248,4712,4713],{},"The relayer, if operated by you, can read checkpoints and deliver messages in both directions",[167,4715,4717],{"id":4716},"references","References",[245,4719,4720,4726,4732,4738],{},[248,4721,4722],{},[133,4723,4725],{"href":135,"rel":4724,"target":138},[137],"Hyperlane: Run Validators",[248,4727,4728],{},[133,4729,4731],{"href":143,"rel":4730,"target":138},[137],"Hyperlane: AWS Signatures Bucket Setup",[248,4733,4734],{},[133,4735,4737],{"href":149,"rel":4736,"target":138},[137],"Hyperlane: Validator Monitoring & Alerting",[248,4739,4740],{},[133,4741,4744],{"href":4742,"rel":4743,"target":138},"https://docs.hyperlane.xyz/docs/operate/config/config-reference",[137],"Hyperlane: Agent Configuration Reference",[4746,4747,4748],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":404,"searchDepth":425,"depth":425,"links":4750},[4751,4752,4753,4754,4759,4760,4761,4762,4766,4767,4768,4769,4770,4771,4772],{"id":169,"depth":425,"text":170},{"id":276,"depth":425,"text":277},{"id":315,"depth":425,"text":316},{"id":754,"depth":425,"text":755,"children":4755},[4756,4757,4758],{"id":759,"depth":492,"text":760},{"id":858,"depth":492,"text":859},{"id":981,"depth":492,"text":982},{"id":1393,"depth":425,"text":1394},{"id":1607,"depth":425,"text":1608},{"id":1764,"depth":425,"text":1765},{"id":2930,"depth":425,"text":2931,"children":4763},[4764,4765],{"id":2964,"depth":492,"text":2965},{"id":3299,"depth":492,"text":3300},{"id":3595,"depth":425,"text":3596},{"id":151,"depth":425,"text":30},{"id":4090,"depth":425,"text":4091},{"id":4411,"depth":425,"text":4412},{"id":4527,"depth":425,"text":4528},{"id":4689,"depth":425,"text":4690},{"id":4716,"depth":425,"text":4717},"Production AWS guide for running BitSong Hyperlane validators with KMS signing, S3 checkpoint storage, private RPCs, and monitoring.","md",null,{},{"icon":28},{"title":4779,"description":4780},"Validator V2 - BitSong Hyperlane AWS Production Guide","Set up production Hyperlane validator agents for the BitSong bridge using AWS KMS, S3, Docker, private RPC endpoints, and Prometheus monitoring.","FG-0UP_K3a8WFcimUF0fUiOsG7p560aUqvEhAQ6kauU",[4783,4785],{"title":59,"path":60,"stem":61,"description":4784,"icon":62,"children":-1},"Test cross-chain token transfers between BitSong and Base Sepolia using your deployed Hyperlane warp route.",{"title":11,"path":75,"stem":76,"description":4786,"icon":14,"children":-1},"Developer overview of the BitSong crescendo-1 testnet with chain specs, endpoints, and tools.",1777300770447]