├── .gitignore ├── README.md ├── images ├── Avail Arch.excalidraw ├── Avail Arch.svg ├── Light Client P2P Network.jpg └── Nomad Avail Message Flow.svg └── reference document ├── ACM-Reference-Format.bst ├── Avail Reference Paper v2 17 Sept 2024.pdf ├── Avail Reference Paper v2.1 6 Nov 2024.pdf ├── DA-KC-Data.drawio ├── DA-KC-Data.png ├── DA_references.bib ├── Data Availability - Reference Document.pdf ├── Data Availability - Reference Document.tex ├── README.md └── acmart.cls /.gitignore: -------------------------------------------------------------------------------- 1 | reference document/Data Availability - Reference Document.log 2 | reference document/Data Availability - Reference Document.synctex.gz 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

Avail

3 |

Documentation & Links for the Avail blockchain

4 |
5 | 6 |
7 | 8 | Avail is a Web3 infrastructure layer that allows modular execution layers to scale and interoperate in a trust minimized way. Below, you can find a list of some of the relevant GitHub repositories. 9 | 10 | | Name (with link) | Description | 11 | |:----------------------:|:---------------------------------------------------------------------------------------:| 12 | | [Reference Document](https://github.com/availproject/data-availability/blob/93c547ce4efce3e992b573179a8d22b3657fdcee/reference%20document/Avail%20Reference%20Paper%20v2.1%206%20Nov%202024.pdf) | Document containing the overall rationale, design decisions and theoretical backgrounds | 13 | | [Avail Node](https://github.com/availproject/avail) | Avail node implementation repo. Built using Substrate. | 14 | | [Light Client](https://github.com/availproject/avail-light) | Light client designed to check data availability proofs on Avail. | 15 | | [Explorer](https://github.com/availproject/avail-apps) | Avail explorer implementation repo. Built using Polkadot apps. | 16 | | [Bridge UI](https://github.com/availproject/bridge-ui) | Repository for the official Avail <-> ETH bridge UI | 17 | | [Documentation](https://availproject.github.io/) | Avail documentation hub. | 18 | | [Tests](https://github.com/availproject/avail-test) | End to end tests for Avail. | 19 | 20 | Suggestions and feedback welcome. 21 | 22 | ## Avail Architecture 23 | 24 | There are two main components in the Avail network: 25 | 26 | - [Avail Node](https://github.com/availproject/avail): This forms the blockchain layer of Avail. It is built using Substrate, with modifications to specialize it for data availability. Apart from basic blockchain operations like balance transfer, validator staking, slashing and governance, it also contains methods for applications to submit data blobs. This network is secured by the GRANDPA+BABE consensus engine, under the assumption that at least 2/3 of the validator set is honest. 27 | - [Avail Light Client](https://github.com/availproject/avail-light): The light clients (LC) form an overlay P2P network. Individually, all LCs subscribe to (finalized) headers of the chain. It performs Data Availability Sampling (DAS) to gain high confidence of DA. The LCs also host the sampled data on the P2P so that together the P2P network can have the entire data in a highly available manner. 28 | 29 | ![Avail Architecture](./images/Light%20Client%20P2P%20Network.jpg) 30 | 31 | ## Bridge between Avail and Ethereum using VectorX 32 | 33 | The Avail team has partnered with [Succinct labs](https://succinct.xyz/) to develop a trust-minimized bridge between Avail DA and Ethereum. VectorX enables efficient and trust-minimized bridging of arbitrary messages between Avail DA and Ethereum, which enables use cases like token bridging. You can use the [bridge](https://docs.availproject.org/docs/end-user-guide/vectorx) through the [official UI](bridge.availproject.org). 34 | 35 | -------------------------------------------------------------------------------- /images/Avail Arch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | Avail NodeAvail NodeAvail NodeAvail NodeAvail NetworkLCLCLCLCLCLCLCLCLCLCHeaderSamplingProofsLCLCLCLCLCLCLCLCLight Client P2P NetworkData SubmissionData Root to Ethereum(optional)High Data AvailabilityBalances, Staking,Governance, ... -------------------------------------------------------------------------------- /images/Light Client P2P Network.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/availproject/data-availability/1fa5e8b1260344b137b17a3dfa1e493a14b5888a/images/Light Client P2P Network.jpg -------------------------------------------------------------------------------- /reference document/ACM-Reference-Format.bst: -------------------------------------------------------------------------------- 1 | %%% -*-BibTeX-*- 2 | %%% ==================================================================== 3 | %%% @BibTeX-style-file{ 4 | %%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray", 5 | %%% version = "2.1", 6 | %%% date = "14 June 2017", 7 | %%% filename = "ACM-Reference-Format.bst", 8 | %%% email = "borisv@lk.net, boris@varphi.com", 9 | %%% codetable = "ISO/ASCII", 10 | %%% keywords = "ACM Transactions bibliography style; BibTeX", 11 | %%% license = "public domain", 12 | %%% supported = "yes", 13 | %%% abstract = "", 14 | %%% } 15 | %%% ==================================================================== 16 | 17 | %%% Revision history: see source in git 18 | 19 | ENTRY 20 | { address 21 | advisor 22 | archiveprefix 23 | author 24 | booktitle 25 | chapter 26 | city 27 | date 28 | edition 29 | editor 30 | eprint 31 | eprinttype 32 | eprintclass 33 | howpublished 34 | institution 35 | journal 36 | key 37 | location 38 | month 39 | note 40 | number 41 | organization 42 | pages 43 | primaryclass 44 | publisher 45 | school 46 | series 47 | title 48 | type 49 | volume 50 | year 51 | % New keys recognized 52 | issue % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra 53 | articleno 54 | eid 55 | day % UTAH: needed for newspapers, weeklies, bi-weeklies 56 | doi % UTAH 57 | url % UTAH 58 | bookpages % UTAH 59 | numpages 60 | lastaccessed % UTAH: used only for @Misc{...} 61 | coden % UTAH 62 | isbn % UTAH 63 | isbn-13 % UTAH 64 | issn % UTAH 65 | lccn % UTAH 66 | } 67 | {} 68 | { label.year extra.label sort.year sort.label basic.label.year} 69 | 70 | INTEGERS { output.state before.all mid.sentence after.sentence after.block } 71 | 72 | INTEGERS { show-isbn-10-and-13 } % initialized below in begin.bib 73 | 74 | INTEGERS { nameptr namesleft numnames } 75 | 76 | INTEGERS { multiresult } 77 | 78 | INTEGERS { len } 79 | 80 | INTEGERS { last.extra.num } 81 | 82 | STRINGS { s t t.org u } 83 | 84 | STRINGS { last.label next.extra } 85 | 86 | STRINGS { p1 p2 p3 page.count } 87 | 88 | 89 | FUNCTION { not } 90 | { 91 | { #0 } 92 | { #1 } 93 | if$ 94 | } 95 | 96 | FUNCTION { and } 97 | { 98 | 'skip$ 99 | { pop$ #0 } 100 | if$ 101 | } 102 | 103 | FUNCTION { or } 104 | { 105 | { pop$ #1 } 106 | 'skip$ 107 | if$ 108 | } 109 | 110 | 111 | FUNCTION { dump.stack.1 } 112 | { 113 | duplicate$ "STACK[top] = [" swap$ * "]" * warning$ 114 | } 115 | 116 | FUNCTION { dump.stack.2 } 117 | { 118 | duplicate$ "STACK[top ] = [" swap$ * "]" * warning$ 119 | swap$ 120 | duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$ 121 | swap$ 122 | } 123 | 124 | FUNCTION { empty.or.unknown } 125 | { 126 | %% Examine the top stack entry, and push 1 if it is empty, or 127 | %% consists only of whitespace, or is a string beginning with two 128 | %% queries (??), and otherwise, push 0. 129 | %% 130 | %% This function provides a replacement for empty$, with the 131 | %% convenient feature that unknown values marked by two leading 132 | %% queries are treated the same as missing values, and thus, do not 133 | %% appear in the output .bbl file, and yet, their presence in .bib 134 | %% file(s) serves to mark values which are temporarily missing, but 135 | %% are expected to be filled in eventually once more data is 136 | %% obtained. The TeX User Group and BibNet bibliography archives 137 | %% make extensive use of this practice. 138 | %% 139 | %% An empty string cannot serve the same purpose, because just as in 140 | %% statistics data processing, an unknown value is not the same as an 141 | %% empty value. 142 | %% 143 | %% At entry: stack = ... top:[string] 144 | %% At exit: stack = ... top:[0 or 1] 145 | 146 | duplicate$ empty$ 147 | { pop$ #1 } 148 | { #1 #2 substring$ "??" = } 149 | if$ 150 | } 151 | 152 | FUNCTION { writeln } 153 | { 154 | %% In BibTeX style files, the sequences 155 | %% 156 | %% ... "one" "two" output 157 | %% ... "one" "two" output.xxx 158 | %% 159 | %% ship "one" to the output file, possibly following by punctuation, 160 | %% leaving the stack with 161 | %% 162 | %% ... "two" 163 | %% 164 | %% There is thus a one-string lag in output processing that must be 165 | %% carefully handled to avoid duplicating a string in the output 166 | %% file. Unless otherwise noted, all output.xxx functions leave 167 | %% just one new string on the stack, and that model should be born 168 | %% in mind when reading or writing function code. 169 | %% 170 | %% BibTeX's asynchronous buffering of output from strings from the 171 | %% stack is confusing because newline$ bypasses the buffer. It 172 | %% would have been so much easier for newline to be a character 173 | %% rather than a state of the output-in-progress. 174 | %% 175 | %% The documentation in btxhak.dvi is WRONG: it says 176 | %% 177 | %% newline$ Writes onto the bbl file what's accumulated in the 178 | %% output buffer. It writes a blank line if and only 179 | %% if the output buffer is empty. Since write$ does 180 | %% reasonable line breaking, you should use this 181 | %% function only when you want a blank line or an 182 | %% explicit line break. 183 | %% 184 | %% write$ Pops the top (string) literal and writes it on the 185 | %% output buffer (which will result in stuff being 186 | %% written onto the bbl file when the buffer fills 187 | %% up). 188 | %% 189 | %% Examination of the BibTeX source code shows that write$ does 190 | %% indeed behave as claimed, but newline$ sends a newline character 191 | %% directly to the output file, leaving the stack unchanged. The 192 | %% first line "Writes onto ... buffer." is therefore wrong. 193 | %% 194 | %% The original BibTeX style files almost always use "write$ newline$" 195 | %% in that order, so it makes sense to hide that pair in a private 196 | %% function like this one, named after a statement in Pascal, 197 | %% the programming language embedded in the BibTeX Web program. 198 | 199 | write$ % output top-of-stack string 200 | newline$ % immediate write of newline (not via stack) 201 | } 202 | 203 | FUNCTION { init.state.consts } 204 | { 205 | #0 'before.all := 206 | #1 'mid.sentence := 207 | #2 'after.sentence := 208 | #3 'after.block := 209 | } 210 | 211 | FUNCTION { output.nonnull } 212 | { % Stack in: ... R S T Stack out: ... R T File out: S 213 | 's := 214 | output.state mid.sentence = 215 | { 216 | ", " * write$ 217 | } 218 | { 219 | output.state after.block = 220 | { 221 | add.period$ writeln 222 | "\newblock " write$ 223 | } 224 | { 225 | output.state before.all = 226 | { 227 | write$ 228 | } 229 | { 230 | add.period$ " " * write$ 231 | } 232 | if$ 233 | } 234 | if$ 235 | mid.sentence 'output.state := 236 | } 237 | if$ 238 | s 239 | } 240 | 241 | FUNCTION { output.nonnull.dot.space } 242 | { % Stack in: ... R S T Stack out: ... R T File out: S 243 | 's := 244 | output.state mid.sentence = % { ". " * write$ } 245 | { 246 | ". " * write$ 247 | } 248 | { 249 | output.state after.block = 250 | { 251 | add.period$ writeln "\newblock " write$ 252 | } 253 | { 254 | output.state before.all = 255 | { 256 | write$ 257 | } 258 | { 259 | add.period$ " " * write$ 260 | } 261 | if$ 262 | } 263 | if$ 264 | mid.sentence 'output.state := 265 | } 266 | if$ 267 | s 268 | } 269 | 270 | FUNCTION { output.nonnull.remove } 271 | { % Stack in: ... R S T Stack out: ... R T File out: S 272 | 's := 273 | output.state mid.sentence = 274 | { 275 | " " * write$ 276 | } 277 | { 278 | output.state after.block = 279 | { 280 | add.period$ writeln "\newblock " write$ 281 | } 282 | { 283 | output.state before.all = 284 | { 285 | write$ 286 | } 287 | { 288 | add.period$ " " * write$ 289 | } 290 | if$ 291 | } 292 | if$ 293 | mid.sentence 'output.state := 294 | } 295 | if$ 296 | s 297 | } 298 | 299 | FUNCTION { output.nonnull.removenospace } 300 | { % Stack in: ... R S T Stack out: ... R T File out: S 301 | 's := 302 | output.state mid.sentence = 303 | { 304 | "" * write$ 305 | } 306 | { 307 | output.state after.block = 308 | { 309 | add.period$ writeln "\newblock " write$ 310 | } 311 | { 312 | output.state before.all = 313 | { 314 | write$ 315 | } 316 | { 317 | add.period$ " " * write$ 318 | } 319 | if$ 320 | } 321 | if$ 322 | mid.sentence 'output.state := 323 | } 324 | if$ 325 | s 326 | } 327 | 328 | FUNCTION { output } 329 | { % discard top token if empty, else like output.nonnull 330 | duplicate$ empty.or.unknown 331 | 'pop$ 332 | 'output.nonnull 333 | if$ 334 | } 335 | 336 | FUNCTION { output.dot.space } 337 | { % discard top token if empty, else like output.nonnull.dot.space 338 | duplicate$ empty.or.unknown 339 | 'pop$ 340 | 'output.nonnull.dot.space 341 | if$ 342 | } 343 | 344 | FUNCTION { output.removenospace } 345 | { % discard top token if empty, else like output.nonnull.removenospace 346 | duplicate$ empty.or.unknown 347 | 'pop$ 348 | 'output.nonnull.removenospace 349 | if$ 350 | } 351 | 352 | FUNCTION { output.check } 353 | { % like output, but warn if key name on top-of-stack is not set 354 | 't := 355 | duplicate$ empty.or.unknown 356 | { pop$ "empty " t * " in " * cite$ * warning$ } 357 | 'output.nonnull 358 | if$ 359 | } 360 | 361 | FUNCTION { bibinfo.output.check } 362 | { % like output.check, adding bibinfo field 363 | 't := 364 | duplicate$ empty.or.unknown 365 | { pop$ "empty " t * " in " * cite$ * warning$ } 366 | { "\bibinfo{" t "}{" * * swap$ * "}" * 367 | output.nonnull } 368 | if$ 369 | } 370 | 371 | FUNCTION { output.check.dot.space } 372 | { % like output.dot.space, but warn if key name on top-of-stack is not set 373 | 't := 374 | duplicate$ empty.or.unknown 375 | { pop$ "empty " t * " in " * cite$ * warning$ } 376 | 'output.nonnull.dot.space 377 | if$ 378 | } 379 | 380 | FUNCTION { fin.block } 381 | { % functionally, but not logically, identical to fin.entry 382 | add.period$ 383 | writeln 384 | } 385 | 386 | FUNCTION { fin.entry } 387 | { 388 | add.period$ 389 | writeln 390 | } 391 | 392 | FUNCTION { new.sentence } 393 | { % update sentence state, with neither output nor stack change 394 | output.state after.block = 395 | 'skip$ 396 | { 397 | output.state before.all = 398 | 'skip$ 399 | { after.sentence 'output.state := } 400 | if$ 401 | } 402 | if$ 403 | } 404 | 405 | FUNCTION { fin.sentence } 406 | { 407 | add.period$ 408 | write$ 409 | new.sentence 410 | "" 411 | } 412 | 413 | FUNCTION { new.block } 414 | { 415 | output.state before.all = 416 | 'skip$ 417 | { after.block 'output.state := } 418 | if$ 419 | } 420 | 421 | FUNCTION { output.coden } % UTAH 422 | { % output non-empty CODEN as one-line sentence (stack untouched) 423 | coden empty.or.unknown 424 | { } 425 | { "\showCODEN{" coden * "}" * writeln } 426 | if$ 427 | } 428 | 429 | % 430 | % Sometimes articleno starts with the word 'Article' or 'Paper. 431 | % (this is a bug of acmdl, sigh) 432 | % We strip them. We assume eid or articleno is already on stack 433 | % 434 | 435 | FUNCTION { strip.articleno.or.eid } 436 | { 437 | 't := 438 | t #1 #7 substring$ "Article" = 439 | {t #8 t text.length$ substring$ 't :=} 440 | { } 441 | if$ 442 | t #1 #7 substring$ "article" = 443 | {t #8 t text.length$ substring$ 't :=} 444 | { } 445 | if$ 446 | t #1 #5 substring$ "Paper" = 447 | {t #6 t text.length$ substring$ 't :=} 448 | { } 449 | if$ 450 | t #1 #5 substring$ "paper" = 451 | {t #6 t text.length$ substring$ 't :=} 452 | { } 453 | if$ 454 | % Strip any left trailing space or ~ 455 | t #1 #1 substring$ " " = 456 | {t #2 t text.length$ substring$ 't :=} 457 | { } 458 | if$ 459 | t #1 #1 substring$ "~" = 460 | {t #2 t text.length$ substring$ 't :=} 461 | { } 462 | if$ 463 | t 464 | } 465 | 466 | 467 | FUNCTION { format.articleno } 468 | { 469 | articleno empty.or.unknown not eid empty.or.unknown not and 470 | { "Both articleno and eid are defined for " cite$ * warning$ } 471 | 'skip$ 472 | if$ 473 | articleno empty.or.unknown eid empty.or.unknown and 474 | { "" } 475 | { 476 | numpages empty.or.unknown 477 | { "articleno or eid field, but no numpages field, in " 478 | cite$ * warning$ } 479 | { } 480 | if$ 481 | eid empty.or.unknown 482 | { "Article \bibinfo{articleno}{" articleno strip.articleno.or.eid * "}" * } 483 | { "Article \bibinfo{articleno}{" eid strip.articleno.or.eid * "}" * } 484 | if$ 485 | } 486 | if$ 487 | } 488 | 489 | FUNCTION { format.year } 490 | { % push year string or "[n.\,d.]" onto output stack 491 | %% Because year is a mandatory field, we always force SOMETHING 492 | %% to be output 493 | "\bibinfo{year}{" 494 | year empty.or.unknown 495 | { "[n.\,d.]" } 496 | { year } 497 | if$ 498 | * "}" * 499 | } 500 | 501 | FUNCTION { format.day.month } 502 | { % push "day month " or "month " or "" onto output stack 503 | day empty.or.unknown 504 | { 505 | month empty.or.unknown 506 | { "" } 507 | { "\bibinfo{date}{" month * "} " *} 508 | if$ 509 | } 510 | { 511 | month empty.or.unknown 512 | { "" } 513 | { "\bibinfo{date}{" day * " " * month * "} " *} 514 | if$ 515 | } 516 | if$ 517 | } 518 | 519 | FUNCTION { format.day.month.year } % UTAH 520 | { % if month is empty, push "" else push "(MON.)" or "(DD MON.)" 521 | % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) 522 | % acm-*.bst addition: prefix parenthesized date string with 523 | % ", Article nnn " 524 | articleno empty.or.unknown eid empty.or.unknown and 525 | { "" } 526 | { output.state after.block = 527 | {", " format.articleno * } 528 | { format.articleno } 529 | if$ 530 | } 531 | if$ 532 | " (" * format.day.month * format.year * ")" * 533 | } 534 | 535 | FUNCTION { output.day.month.year } % UTAH 536 | { % if month is empty value, do nothing; else output stack top and 537 | % leave with new top string "(MON.)" or "(DD MON.)" 538 | % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) 539 | format.day.month.year 540 | output.nonnull.remove 541 | } 542 | 543 | FUNCTION { strip.doi } % UTAH 544 | { % Strip any Web address prefix to recover the bare DOI, leaving the 545 | % result on the output stack, as recommended by CrossRef DOI 546 | % documentation. 547 | % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to 548 | % "10.1145/1534530.1534545". A suitable URL is later typeset and 549 | % displayed as the LAST item in the reference list entry. Publisher Web 550 | % sites wrap this with a suitable link to a real URL to resolve the DOI, 551 | % and the master https://doi.org/ address is preferred, since publisher- 552 | % specific URLs can disappear in response to economic events. All 553 | % journals are encouraged by the DOI authorities to use that typeset 554 | % format and link procedures for uniformity across all publications that 555 | % include DOIs in reference lists. 556 | % The numeric prefix is guaranteed to start with "10.", so we use 557 | % that as a test. 558 | % 2017-02-04 Added stripping of https:// (Boris) 559 | doi #1 #3 substring$ "10." = 560 | { doi } 561 | { 562 | doi 't := % get modifiable copy of DOI 563 | 564 | % Change https:// to http:// to strip both prefixes (BV) 565 | 566 | t #1 #8 substring$ "https://" = 567 | { "http://" t #9 t text.length$ #8 - substring$ * 't := } 568 | { } 569 | if$ 570 | 571 | t #1 #7 substring$ "http://" = 572 | { 573 | t #8 t text.length$ #7 - substring$ 't := 574 | 575 | "INTERNAL STYLE-FILE ERROR" 's := 576 | 577 | % search for next "/" and assign its suffix to s 578 | 579 | { t text.length$ } 580 | { 581 | t #1 #1 substring$ "/" = 582 | { 583 | % save rest of string as true DOI (should be 10.xxxx/yyyy) 584 | t #2 t text.length$ #1 - substring$ 's := 585 | "" 't := % empty string t terminates the loop 586 | } 587 | { 588 | % discard first character and continue loop: t <= substring(t,2,last) 589 | t #2 t text.length$ #1 - substring$ 't := 590 | } 591 | if$ 592 | } 593 | while$ 594 | 595 | % check for valid DOI (should be 10.xxxx/yyyy) 596 | s #1 #3 substring$ "10." = 597 | { } 598 | { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ } 599 | if$ 600 | 601 | s % push the stripped DOI on the output stack 602 | 603 | } 604 | { 605 | "unrecognized DOI value [" doi * "]" * warning$ 606 | doi % push the unrecognized original DOI on the output stack 607 | } 608 | if$ 609 | } 610 | if$ 611 | } 612 | 613 | % 614 | % Change by BV: added standard prefix to URL 615 | % 616 | FUNCTION { output.doi } % UTAH 617 | { % output non-empty DOI as one-line sentence (stack untouched) 618 | doi empty.or.unknown 619 | { } 620 | { 621 | %% Use \urldef here for the same reason it is used in output.url, 622 | %% see output.url for further discussion. 623 | "\urldef\tempurl%" writeln 624 | "\url{https://doi.org/" strip.doi * "}" * writeln 625 | "\showDOI{\tempurl}" writeln 626 | } 627 | if$ 628 | } 629 | 630 | FUNCTION { output.isbn } % UTAH 631 | { % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched) 632 | show-isbn-10-and-13 633 | { 634 | %% show both 10- and 13-digit ISBNs 635 | isbn empty.or.unknown 636 | { } 637 | { 638 | "\showISBNx{" isbn * "}" * writeln 639 | } 640 | if$ 641 | isbn-13 empty.or.unknown 642 | { } 643 | { 644 | "\showISBNxiii{" isbn-13 * "}" * writeln 645 | } 646 | if$ 647 | } 648 | { 649 | %% show 10-digit ISBNs only if 13-digit ISBNs not available 650 | isbn-13 empty.or.unknown 651 | { 652 | isbn empty.or.unknown 653 | { } 654 | { 655 | "\showISBNx{" isbn * "}" * writeln 656 | } 657 | if$ 658 | } 659 | { 660 | "\showISBNxiii{" isbn-13 * "}" * writeln 661 | } 662 | if$ 663 | } 664 | if$ 665 | } 666 | 667 | FUNCTION { output.issn } % UTAH 668 | { % output non-empty ISSN as one-line sentence (stack untouched) 669 | issn empty.or.unknown 670 | { } 671 | { "\showISSN{" issn * "}" * writeln } 672 | if$ 673 | } 674 | 675 | FUNCTION { output.issue } 676 | { % output non-empty issue number as a one-line sentence (stack untouched) 677 | issue empty.or.unknown 678 | { } 679 | { "Issue " issue * "." * writeln } 680 | if$ 681 | } 682 | 683 | FUNCTION { output.lccn } % UTAH 684 | { % return with stack untouched 685 | lccn empty.or.unknown 686 | { } 687 | { "\showLCCN{" lccn * "}" * writeln } 688 | if$ 689 | } 690 | 691 | FUNCTION { output.note } % UTAH 692 | { % return with stack empty 693 | note empty.or.unknown 694 | { } 695 | { "\shownote{" note add.period$ * "}" * writeln } 696 | if$ 697 | } 698 | 699 | FUNCTION { output.note.check } % UTAH 700 | { % return with stack empty 701 | note empty.or.unknown 702 | { "empty note in " cite$ * warning$ } 703 | { "\shownote{" note add.period$ * "}" * writeln } 704 | if$ 705 | } 706 | 707 | FUNCTION { output.eprint } % 708 | { % return with stack empty 709 | eprint empty.or.unknown 710 | { } 711 | { "\showeprint" 712 | archiveprefix empty.or.unknown 713 | { eprinttype empty.or.unknown 714 | { } 715 | { "[" eprinttype "]" * * * } 716 | if$ 717 | } 718 | { "[" archiveprefix "l" change.case$ "]" * * * } 719 | if$ 720 | "{" eprint "}" * * * 721 | primaryclass empty.or.unknown 722 | { eprintclass empty.or.unknown 723 | { } 724 | { "~[" eprintclass "]" * * * } 725 | if$ 726 | } 727 | { "~[" primaryclass "]" * * * } 728 | if$ 729 | writeln 730 | } 731 | if$ 732 | } 733 | 734 | 735 | % 736 | % Changes by BV 2011/04/15. Do not output 737 | % url if doi is defined 738 | % 739 | FUNCTION { output.url } % UTAH 740 | { % return with stack untouched 741 | % output URL and associated lastaccessed fields 742 | doi empty.or.unknown 743 | { 744 | url empty.or.unknown 745 | { } 746 | { 747 | %% Use \urldef, outside \showURL, so that %nn, #, etc in URLs work 748 | %% correctly. Put the actual URL on its own line to reduce the 749 | %% likelihood of BibTeX's nasty line wrapping after column 79. 750 | %% \url{} can undo this, but if that doesn't work for some reason 751 | %% the .bbl file would have to be repaired manually. 752 | "\urldef\tempurl%" writeln 753 | "\url{" url * "}" * writeln 754 | 755 | "\showURL{%" writeln 756 | lastaccessed empty.or.unknown 757 | { "" } 758 | { "Retrieved " lastaccessed * " from " * } 759 | if$ 760 | "\tempurl}" * writeln 761 | } 762 | if$ 763 | } 764 | { } 765 | if$ 766 | } 767 | 768 | FUNCTION { output.year.check } 769 | { % warn if year empty, output top string and leave " YEAR