Да, можно изменить код контракта в TON. Просто реализуйте это внутри своего смарт-контракта, который будет обновлять код контракта с помощью функции стандартной библиотеки FunC (stdlib.fc):
() set_code(cell new_code) impure asm "SETCODE";
Простая реализация внутри recv_internal:
#include "stdlib.fc";
global slice ctx_owner;
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) { ;; ignore all bounced messages
return ();
}
;; Admin methods
;; if the in_msg_body is empty, then it is a simple money transfer
if (equal_slice_bits(sender_addr, ctx_owner) & (~ in_msg_body.slice_empty?())) {
int op = in_msg_body~load_uint(32);
if (op == "op::update_code"c) {
set_code(in_msg_body~load_ref());
}
}
}
Кроме того, вы можете найти спецификацию set_code здесь: https://ton.org/docs/develop/func/stdlib/#set_code