1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Copyright (c) The Libra Core Contributors
// SPDX-License-Identifier: Apache-2.0

pub mod stdlib;
pub mod transaction_scripts;

use lazy_static::lazy_static;
use solana_libra_bytecode_verifier::{verify_module_dependencies, VerifiedModule};
use solana_libra_ir_to_bytecode::compiler::compile_module;
use solana_libra_types::{account_address::AccountAddress, account_config};

lazy_static! {
    static ref STDLIB_MODULES: Vec<VerifiedModule> =
        build_stdlib(account_config::core_code_address());
}

/// Returns a reference to the standard library, compiled with the
/// [default address](account_config::core_code_address).
///
/// The order the modules are presented in is important: later modules depend on earlier ones.
pub fn stdlib_modules() -> &'static [VerifiedModule] {
    &*STDLIB_MODULES
}

/// Builds and returns a copy of the standard library with this address as the self address.
///
/// A copy of the stdlib built with the [default address](account_config::core_code_address) is
/// available through [`stdlib_modules`].
pub fn build_stdlib(address: AccountAddress) -> Vec<VerifiedModule> {
    let mut stdlib_modules = vec![];

    for module_def in stdlib::module_defs() {
        let compiled_module = compile_module(address, (*module_def).clone(), &stdlib_modules)
            .expect("stdlib module failed to compile");
        let verified_module =
            VerifiedModule::new(compiled_module).expect("stdlib module failed to verify");

        let verification_errors = verify_module_dependencies(&verified_module, &stdlib_modules);
        // Fail if the module doesn't verify
        for e in &verification_errors {
            println!("{:?}", e);
        }
        assert!(verification_errors.is_empty());

        stdlib_modules.push(verified_module);
    }

    stdlib_modules
}